我正在尝试打印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”时,它似乎工作。它似乎不接受它作为变量。请帮助我解决问题。
答案 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