从多个文件打印请求的行

时间:2015-12-23 02:22:37

标签: awk sed

我想从多个文件中获取特定行。

我试过这样做:

sed -n "5p;10p" file1.txt file2.txt

但它只打印第一个文件中的行,是否有人有解决方案? 感谢

4 个答案:

答案 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