2016-04-19 76 views
1

我写了一个单行代码,用于搜索文件夹中的某些文件的字符串列表。使用awk在i循环中打印“n”个字段的数字

的想法是创建一个新的输出,列出被搜索的字符串,然后是所有它发现它在文件中。

文件列表包含以下

alexl-lap:projects alexl$ cat list 
abc-123 
def-456 

这是我到目前为止有:

alexl-lap:projects alexl$ for i in `cat list` ; do printf "\n$i:\n" ; grep -l --color=always $i * | /usr/bin/awk '{printf("%s\n", $0)}' ; done >> log.txt 

alexl-lap:projects alexl$ cat log.txt 

abc-123: 
file1.txt 
file2.txt 
file3.txt 

def-456: 
file1.txt 
file2.txt 
file3.txt 
file4.txt 
file5.txt 

如果我现在运行下面的命令,这是我得到

alexl-lap:projects alexl$ /usr/bin/awk 'BEGIN{RS="";FS="\n"} {print $1 " " $2 "" $3 "" $4 "" $5 " "}' < log.txt 
abc-123: file1.txt file2.txt file3.txt 
def-456: file1.txt file2.txt file3.txt file4.txt file5.txt 

这种使用手动指定字段显然是不好的做法。如果在15个文件中找到正在搜索的字符串,则需要包含1-15个字符。

如何使用'nth'变量来实现这一点?

我想要相同的输出,但awk查看文件的文件数量,并打印所有这些后,它搜索的字符串(在一行中)。

感谢

+0

嗯,似乎有很多不必要的步骤,在这里拍摄 - 你能[编辑]你的问题,解释正是你想做什么,我们展示一个输入和输出样本? –

+0

希望这会有所帮助 – ARL

回答

0

该解决方案假定所有file*txt文件名不包含特殊字符,也不:

试试看:

grep -Hf list *txt | awk 'BEGIN {FS=":"} {string=substr($0,length($1)+2); if (!filenames[string]) {filenames[string]=$1;} else {filenames[string]=sprintf("%s %s",filenames[string],$1);}} END {for (string in filenames) { print string ":" filenames[string]; }}' 

def-456:file1.txt file2.txt file3.txt file4.txt file5.txt 
abc-123:file1.txt file2.txt file3.txt