从特定列的多个文件中的文件中搜索多个字符串,并在 unix shell 脚本中输出计数

Search multiple strings from file in multiple files in specific column and output the count in unix shell scripting

我在互联网上广泛搜索了这方面的内容,但没有找到太多细节。

问题描述:

我正在使用 aix 服务器。

我有一个 pattern.txt 文件,其中包含 100 个客户的 customer_id,格式如下:

160471231

765082023

75635713

797649756

8011688321

803056646

我有一个目录 (/home/aswin/temp),其中包含多个文件(1.txt、2.txt、3.txt 等),这些文件以竖线 (|) 分隔。示例格式:

797649756|1001|123270361|797649756|O|2017-09-04 23:59:59|10|123769473 803056646|1001|123345418|1237330|O|1999-02-13 00:00:00|4|1235092 64600123|1001|123885297|1239127|O|2001-08-19 00:00:00|10|1233872 75635713|1001|123644701|75635713|C|2006-11-30 00:00:00|11|12355753 424346821|1001|123471924|12329388|O|1988-05-04 00:00:00|15|123351096 427253285|1001|123179704|12358099|C|2012-05-10 18:00:00|7|12352893

我需要做的是在目录中的所有文件中搜索 pattern.txt 文件中的所有字符串,在每个文件的第一列中,并列出每个文件名和匹配项数。因此,如果同一行有超过 1 个匹配项,则应将其计为 1。

所以输出应该是这样的(只有第一列中的匹配才算在内):

1.txt:4

2.txt:3

3.txt:2

4.txt:5

到目前为止我做了什么:

cd /home/aswin/temp

grep -srcFf ./pattern.txt * /dev/null >> logfile.txt

这会以所需格式提供输出,但它会搜索所有列中的字符串,而不仅仅是第一列。所以输出的数量远远超过预期。

请帮忙

如果你想用 grep 做到这一点,你必须改变模式。

使用您的命令,您在 /dev/null 中搜索模式,输出为 /dev/null:0

我想你想要 2>/dev/null 但这不是必需的,因为你告诉 -s 到 grep。

您的模式文件在同一目录中,因此 grep 在其中搜索并输出 pattern.txt:6

您的所有文件都在同一目录中,因此不需要 -r。

你把日志文件放在同一个目录下,所以第二次你运行命令grep在里面搜索并输出logfile.txt:0

如果你能修改模式文件,你把每一行都写成^765082023| 并且您不使用 .txt

重命名此文件

所以这个命令给了你你要找的东西。

grep -scf pattern *.txt >>logfile

如果不能修改pattern文件,可以使用awk。

awk -F'|' '
NR==FNR{a[[=11=]];next}
FILENAME=="pattern.txt"{next}
 in a {b[FILENAME]++}
END{for(i in b){print i,":",b[i]}}
' pattern.txt *.txt >>logfile.txt