我有 5000 多个文件的集合,我只想创建一个output.txt
包含所有文件的第 27 行及其文件名的文件。我从互联网上得到的是使用awk
或sed
命令从单个文件中选择特定行,例如:
$sed -n 27p *.txt >>output.txt
例如我在目录中的文件是:
log_1.txt
log_2.txt
log_3.txt
log_4.txt
.
.
.
我想要每个文件的第 27 行及其文件名位于新文件中打印行的前面或后面output.txt
。
答案1
awk 'FNR==27 {print FILENAME, $0}' *.txt >output.txt
FILENAME
是当前输入文件名的内置 awk 变量FNR
引用当前文件的行号$0
表示整行
答案2
另一种可能性是:
for i in * ; do echo -n $i" : " ; head -n 27 "$i" | tail -n 1 ; done > output.txt
答案3
使用for
循环:
{ for i in *.txt; do echo "$i : $(sed -n '27p' "$i")"; done ;} >output.txt
由于您有 5000 多个文件,因此循环for
可能会很昂贵,但考虑到当前的硬件应该不是问题。
更快的方法,sed
在第 27 行后退出(感谢@Fiximan):
{ for i in *.txt; do echo "$i : $(sed -n '27p;q' "$i")"; done ;} >output.txt
答案4
简单的 awk 用法:
awk 'FNR==27 {print FILENAME,$0}' /path/to/files/log_*.txt > outfile.txt