与我之前的问题相关......
我想从 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
。
对于数字顺序,您可以使用zsh
shell 并执行以下操作:
grep -h '^kgf' File_*(n) > Output_file
其中n
glob 限定符打开仅用于扩展该 glob 的numericglobsort
选项(另一个特定功能)。zsh
如果在 GNU 系统上(-h
您使用的选项已经是 GNU 扩展)并且使用任何 shell,您可以执行类似的操作:
printf '%s\0' File_* | sort -zV | xargs -r0 grep -h '^kgf' > Output_file
哪里sort -V
有一个版本sort 的行为类似于zsh
s数字全局排序。