使用基于变量列值的选定行数据创建新文件

时间:2017-02-19 06:34:44

标签: bash awk grep

我正在尝试打印file1中与file2第4列中的数据匹配的行作为变量。 file2中的数据如下:

bb  350     300 350
cc  100     200 100
dd  -100    200 -100
ee  -300    200 -300
ff  -500    200 -500
gg  -700    200 -700
hh  -900    400 -900
ii  -1200   400 -1200
jj  -1600   400 -1600
kk  -2000   400 -2000
ll  -2600   800 -2600

假设file1中的数据如下:

bb   350    300 350
cc   100    200 100
dd  -100    200 -100
ee  -300    200 -300
ff  -500    200 -500
gg  -700    200 -700
hh  -900    400 -900
ii  -1200   400 -1200
jj  -1600   400 -1600
kk  -2000   400 -2000
ll  -2600   800 -2600

我使用的代码如下:

 while read line
    do
      set -- ${line}
      idx="$4"
      z="$2"

    awk -F"\t" -v OFS="\t" '$4 == "$idx" { print $1,$2,$3,$4 }' file1

done < file2

问题是我没有得到任何输出,但当我做'$ 4 ==“ - 2600”时,它似乎工作。它似乎不接受它作为变量。请帮助我解决问题。

1 个答案:

答案 0 :(得分:1)

使用awk,如下所示

$ awk 'FNR==NR{a[$4];next}$4 in a' file2 file1

<强>输入

$ cat file1
bb   350    300 350
cc   100    200 100
dd  -100    200 -100
ee  -300    200 -300
ff  -500    200 -500
gg  -700    200 -700
hh  -900    400 -900
ii  -1200   400 -1200
jj  -1600   400 -1600
kk  -2000   400 -2000
ll  -2600   800 -2600

$ cat file2
bb  350     300 350
cc  100     200 100
dd  -100    200 -100
ee  -300    200 -300
ff  -500    200 -500
gg  -700    200 -700
hh  -900    400 -900
ii  -1200   400 -1200
jj  -1600   400 -1600
kk  -2000   400 -2000
ll  -2600   800 -2600

会产生输出

awk 'FNR==NR{a[$4];next}$4 in a' file2 file1
bb   350    300 350
cc   100    200 100
dd  -100    200 -100
ee  -300    200 -300
ff  -500    200 -500
gg  -700    200 -700
hh  -900    400 -900
ii  -1200   400 -1200
jj  -1600   400 -1600
kk  -2000   400 -2000
ll  -2600   800 -2600

<强>解释

  •   

    FNR==NR如果到目前为止在当前文件中读取的记录数
      等于所有文件到目前为止读取的记录数,
      条件,只有在第一个文件读取时才为真。

  •   

    a[$4]填充数组&#34; a&#34;这样的   以4号为索引   字段,来自file2的当前记录

  •   

    next转到下一条记录,以便我们不进行任何处理   用于第二个文件(file1)的记录。

  •   

    $4 in a如果数组a索引是从...构造的   file1的当前记录的字段4存在   在数组a中,我们得到布尔值true,因此awk从file1执行默认操作print $0