Awk 打印多个文件中请求的行

Awk 打印多个文件中请求的行,awk,sed,Awk,Sed,我想从多个文件中获取特定行 我试着这样做: sed -n "5p;10p" file1.txt file2.txt 但它只打印第一个文件中的行,有人有解决方案吗? 谢谢如果您使用的是GNU sed,您可以使用-s开关。从手册中: '-s'-单独的' 默认情况下,“SED”将考虑命令上指定的文件。 作为一条连续的长流的线。此GNU“sed”扩展 允许用户将它们视为单独的文件:范围 地址(如“/abc/,/def/”)不允许跨越多个地址 文件,行号相对于每个文件的开头“$” 指每个文件的最后一行,

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

我试着这样做:

sed -n "5p;10p" file1.txt file2.txt
但它只打印第一个文件中的行,有人有解决方案吗?
谢谢

如果您使用的是GNU sed,您可以使用
-s
开关。从手册中:

'-s'-单独的'
默认情况下,“SED”将考虑命令上指定的文件。
作为一条连续的长流的线。此GNU“sed”扩展
允许用户将它们视为单独的文件:范围
地址(如“/abc/,/def/”)不允许跨越多个地址
文件,行号相对于每个文件的开头“$”
指每个文件的最后一行,以及从
“R”命令在每个文件的开头都会被重绕。

我猜
sed
是在处理这些文件之前将它们连接起来。试着这样做:

for f in file1.txt file2.txt; do
    sed -n "5p;10p" $f
done

awk
救援

$ awk 'FNR==5 || FNR==10' file{1,2}.txt
将打印两个文件中的第5行和第10行

或者,每5行,很容易(5,10,15,…)

或者,质数行

$ awk '{for(i=2;i<=sqrt(NR);i++) if(!(NR%i)) next} NR>1' file{1,2}.txt
$awk'{for(i=2;i1'文件{1,2}.txt

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
$cat tst.awk
开始{
拆分(行、tmp、/、/)
对于(tmp中的i){
分割(tmp[i],范围/-/)
j=范围[1]
做{
fnrs[j]

}而(j++
sed
不区分多个文件,并将它们视为一个流。@karakfa:哎哟,从来没有遇到过。像往常一样,有一个awk解决方案;-)删除我以前的评论。感谢分享!整洁,我不知道这一点!对于OSX上的用户,您可以使用自制安装gnu sed,并以
gsed
的身份访问它。值得知道的是
-I
交换机在幕后使用
-s
交换机。
$ 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