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