Sed或awk:如何从单独的文件调用行地址?

Sed或awk:如何从单独的文件调用行地址?,sed,awk,Sed,Awk,我有100行的“file1”。我想使用sed或awk将第23、71和84行(例如)打印到“file2”。这三个行号位于单独的文件“列表”中,每个行号位于单独的行中 当我使用这些命令时,只打印第84行: for i in $(cat list); do sed -n "${i}p" file1 > file2; done for i in $(cat list); do awk 'NR==x {print}' x=$i file1 > file2; done for循环能否以这种方式用于向sed

我有100行的“file1”。我想使用sed或awk将第23、71和84行(例如)打印到“file2”。这三个行号位于单独的文件“列表”中,每个行号位于单独的行中

当我使用这些命令时,只打印第84行:

for i in $(cat list); do sed -n "${i}p" file1 > file2; done

for i in $(cat list); do awk 'NR==x {print}' x=$i file1 > file2; done

for循环能否以这种方式用于向sed或awk提供线路地址?

您必须
>
(附加到文件中)。但您正在覆盖该文件。这就是为什么,您总是在文件2中只得到84行

尝试使用

for i in $(cat list); do sed -n "${i}p" file1 >> file2; done

您需要在循环之后执行
,以便捕获所有内容。由于您在循环中使用它,文件将被覆盖。在循环内部,您需要执行
>

好的做法是在循环之外使用
,这样在每次循环迭代期间文件都不会打开进行写入

但是,您可以在
awk
中执行任何操作,而无需
for循环

awk 'NR==FNR{a[$1]++;next}FNR in a' list file1 > file2
对于sed:

 sed -n $(sed -e 's/^/-e /' -e 's/$/p/' list) input
给定示例输入,inner命令创建如下字符串:`

-e 23p 
-e 71p 
-e 84p 

因此,外部sed然后打印出给定的行

您可以避免在for/while循环中运行sed/awk,另外:

# store all lines numbers in a variable using pipe
lines=$(echo $(<list) | sed 's/ /|/g')

# print lines of specified line numbers and store output
awk -v lineS="^($lines)$" 'NR ~ lineS' file1 > out
#使用管道将所有行号存储在变量中
行=$(回显$(输出)
这可能适合您(GNU-sed):


使用
list
构建一个
sed
脚本。

我会使用管道和
sed-f-
来代替。就像这样:
sed-e's/^/-e/'-e's/$/p/'list | sed-f--n list
是和不!!!请看@Jaypal的答案以获得正确的方法来做你想要的事情。@Ed Norton-我已经尝试了所有建议的解决方案,它们都有效。对于我的一方这个问题(不同于我发布的简化问题),理想的解决方案是佩雷尔的。谢谢你,先生。这意味着很多来自大师本人。:)
sed 's/.*/&p/' list | sed -nf - file1 >file2