从特定列的多个文件中的文件中搜索多个字符串,并在 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
我在互联网上广泛搜索了这方面的内容,但没有找到太多细节。
问题描述:
我正在使用 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