我想从多个文件中获取特定行。
我试过这样做:
sed -n "5p;10p" file1.txt file2.txt
但它只打印第一个文件中的行,是否有人有解决方案? 感谢
答案 0 :(得分:6)
awk
救援!
$ awk 'FNR==5 || FNR==10' file{1,2}.txt
将从两个文件中打印第5行和第10行。
或者,每隔5行,轻松(5,10,15,...)
$ awk '!(FNR%5)' file{1,2}.txt
或者,素数行
$ awk '{for(i=2;i<=sqrt(NR);i++) if(!(NR%i)) next} NR>1' file{1,2}.txt
答案 1 :(得分:3)
如果您使用的是GNU sed,则可以使用-s
开关。从手册:
'-s' '--separate'
By default, 'sed' will consider the files specified on the command
line as a single continuous long stream. This GNU 'sed' extension
allows the user to consider them as separate files: range
addresses (such as '/abc/,/def/') are not allowed to span several
files, line numbers are relative to the start of each file, '$'
refers to the last line of each file, and files invoked from the
'R' commands are rewound at the start of each file.
答案 2 :(得分:3)
我猜sed
在处理这些文件之前将它们连接起来。尝试这样的事情:
for f in file1.txt file2.txt; do
sed -n "5p;10p" $f
done
答案 3 :(得分:1)
sed用于单个行上的简单替换,即全部。对于其他任何你应该使用awk。这个问题不是单个行上的简单替换,因此你不应该使用sed,你应该使用awk:
$ cat tst.awk
BEGIN {
split(lines,tmp,/,/)
for (i in tmp) {
split(tmp[i],range,/-/)
j = range[1]
do {
fnrs[j]
} while (j++<range[2])
}
}
FNR in fnrs { print FILENAME, FNR, $0 }
$ paste file1 file2
a A
b B
c C
d D
e E
f F
g G
$ awk -v lines="2,4-6" -f tst.awk file1 file2
file1 2 b
file1 4 d
file1 5 e
file1 6 f
file2 2 B
file2 4 D
file2 5 E
file2 6 F