我有两个文件,file1
a
b
c
d
e
f
g
h
i
j
和file2
b
c zzz uuu
d qqq lll
a xxx ggg
f
b
g
e rrr ppp
如果数字匹配,我想将file2的内容附加到file1上,但是,我也想打印出file1的不匹配行而不更改顺序。 因此,理想的效果是
a xxx ggg
b
c zzz uuu
d qqq lll
e rrr ppp
f
g
h
i
j
匹配列也可以重复,这不是问题,所以也可以
a a xxx ggg
b b
c c zzz uuu
d d qqq lll
e e rrr ppp
f f
g g
h h
i i
j j
我尝试过
awk 'FNR==NR{a[$1]=$0;next} ($1 in a) {print a[$1],$0}' a b
但结果是
b b
c c zzz uuu
d d qqq lll
a a xxx ggg
f f
b b
g g
e e rrr ppp
所以顺序丢失了,文件1中缺少行,有什么建议吗?
答案 0 :(得分:2)
能否请您尝试以下。
awk 'FNR==NR{val=$1;$1="";sub(/^ +/,"");a[val]=$0;next} {print $0,a[$1]}' Input_file2 Input_file1
说明:
此处FNR==NR
处的检查条件表示,如果FNR等于NR的值,则执行以下操作。当读取第一个Inpit_file2时,此条件成立。
现在创建一个名为val
的变量,其值是第一个字段,然后使第一个字段无效,并用NULL代替初始空间。
现在创建一个名为的数组,其索引是变量val,值是当前行。
使用next
将跳过此处的所有其他声明。
现在打印第一个字段,然后在不存在该值的情况下打印一个[$ 1]值,它将留空。
答案 1 :(得分:1)
请尝试:
awk 'FNR==NR{a=$1;$1="";b[a]=$0;next} {print $1, b[$1]}' file2 file1
结果:
a xxx ggg
b
c zzz uuu
d qqq lll
e rrr ppp
f
g
h
i
j
答案 2 :(得分:1)
假设真实文件1的排序方式如您的示例所示:
$ join -j1 -o 0,2.2,2.3 -a1 file1.txt <(sort -u file2.txt)
a xxx ggg
b
c zzz uuu
d qqq lll
e rrr ppp
f
g
h
i
j
答案 3 :(得分:0)
另一种方式:
awk 'FNR==NR{b[$1]=$0;next} {print $0,b[$1]}' b a