如何按文件顺序从多个文件中获取包含字符串的行?

如何按文件顺序从多个文件中获取包含字符串的行?

与我之前的问题相关......

我想从 5000 个文件中获取第一列具有特定字符串的行。但我想按输入文件的顺序显示输出文件中的行。例如,

文件_1

agd fkg fls  ofk
ggs kkg ikg  gkl
bsg ksf olg  lzj
many more lines,,,
kgf kkg ikg  lgk

文件_2

gik zlg olg  pzk
ppl sjg gol  dzj
zjg iwj bmh  hgi
many more lines,,,
kgf wlg ugk  lkf

还有更多文件...

输出文件

kgf kkg ikg lgk  -- This line from the File_1
kgf wlg ugk lkf  -- This is from the File_2
more lines...
kgf ald fig wdg  -- This last line is from the File_5000 

只需从多个文件中获取一行即可如下所示。

grep -rEh `kgf` File_* > Output_file

但如果我这样做,output_file 将按随机顺序显示行。输出文件的第一行可以来自 File_20 或其他文件,而不是 File_1。所以我希望output_file在输出文件的第一行中显示File_1中的行,File_2是输出文件的第二行,File_3是输出文件的第三行,等等。

有人知道这个吗?

先感谢您!

答案1

的扩展顺序File_*不是随机的。 Shell 通配符按词法对文件名进行排序(使用strcmp()(字节到字节比较)或strcoll()(用户的区域设置排序规则),具体取决于 shell)。

这意味着无论如何那File_10将会到来 File_2

对于数字顺序,您可以使用zshshell 并执行以下操作:

grep -h '^kgf' File_*(n) > Output_file

其中nglob 限定符打开仅用于扩展该 glob 的numericglobsort选项(另一个特定功能)。zsh

如果在 GNU 系统上(-h您使用的选项已经是 GNU 扩展)并且使用任何 shell,您可以执行类似的操作:

printf '%s\0' File_* | sort -zV | xargs -r0 grep -h '^kgf' > Output_file

哪里sort -V有一个版本sort 的行为类似于zshs数字全局排序。

相关内容