使用awk基于来自其他文件的值从一个文件打印多个NR

时间:2018-01-10 21:31:17

标签: awk

我想根据另一个文件的输入值从一个文件中打印出多行。 以下是文件1的表示:

2
4
1

以下是文件2的表示:

MANCHKLGO
kflgklfdg
fhgjpiqog
fkfjdkfdg
fghjshdjs
jgfkgjfdk
ghftrysba
gfkgfdkgj
jfkjfdkgj

基于第一个文件的第一列,代码应首先打印第二个文件的第二行,然后是第四行,然后是第二个文件的第一行。因此,输出应该如下:

kflgklfdg
fkfjdkfdg
MANCHKLGO

以下是我尝试过的代码:

awk 'NR==FNR{a[$1];next}FNR in a{print $0}' file1.txt file2.txt

但是,正如预期的那样,输出不是第一行打印的顺序,而第二行和第四行是最后一行。如何从第二个文件中按照第一个文件中给出的顺序打印NR?

2 个答案:

答案 0 :(得分:2)

尝试:

$ awk 'NR==FNR{a[NR]=$0;next} {print a[$1]}' file2 file1
kflgklfdg
fkfjdkfdg
MANCHKLGO

如何运作

  • NR==FNR{a[NR]=$0;next}

    这会将file2的内容保存在数组a中。

  • print a[$1]

    对于file1中的每个数字,我们打印所需的file2行。

早期版本问题的解决方案

$ awk 'NR==FNR{a[NR]=$0;next} {print a[2*$1];print a[2*$1+1]}' file2 file1
fkfjdkfdg
fghjshdjs
gfkgfdkgj
jfkjfdkgj
kflgklfdg
fhgjpiqog

答案 1 :(得分:1)

另一种观点:

awk '
    NR==FNR {a[$1]; order[n++] = $1; next} 
    FNR in a {lines[FNR] = $0} 
    END {for (i=0; i<n; i++) print lines[order[i]]}
' file1.txt file2.txt

如果文件太大,此版本在内存中存储的行数较少。