Bash 使用awk比较两个文件并从中提取信息

Bash 使用awk比较两个文件并从中提取信息,bash,awk,Bash,Awk,cat文件1: a b c d e cat文件2: a 10 c 20 e 30 f 40 所需的输出文件是: a 10 b c 20 d e 30 f 40 我尝试过使用awk,但最后我重复了file1的所有行。 非常感谢读入这两个文件并将它们散列到一个数组(a)。如果您在file2之前阅读file1,则冲突将对您有利。在awk中: $ awk '{a[$1]=$0} END{for(i in a) print a[i]}' file1 file2 a 10 b c

cat文件1:

a
b
c
d
e
cat文件2:

a  10
c  20
e  30
f  40
所需的输出文件是:

a  10
b
c  20
d
e  30
f  40
我尝试过使用awk,但最后我重复了file1的所有行。
非常感谢

读入这两个文件并将它们散列到一个数组(
a
)。如果您在
file2
之前阅读
file1
,则冲突将对您有利。在awk中:

$ awk '{a[$1]=$0} END{for(i in a) print a[i]}' file1 file2
a  10
b
c  20
d
e  30
f  40
解释:

{
    a[$1]=$0        # hash all records to a 
} 
END {               # after processing both files
    for(i in a)     # iterate thru every key in a
        print a[i]  # and output their values
}

由于(a中的i)的性质,输出顺序是随机的

读入两个文件并将它们散列到一个数组(
a
)。如果您在
file2
之前阅读
file1
,则冲突将对您有利。在awk中:

$ awk '{a[$1]=$0} END{for(i in a) print a[i]}' file1 file2
a  10
b
c  20
d
e  30
f  40
解释:

{
    a[$1]=$0        # hash all records to a 
} 
END {               # after processing both files
    for(i in a)     # iterate thru every key in a
        print a[i]  # and output their values
}

由于(a中的i)的性质,输出顺序是随机的

另一种
awk
和不太聪明的方法

$ awk 'NR==FNR {a[$1]=$2; next} 
       $1 in a {$2=a[$1]; delete a[$1]} 
               1; 
       END     {for(k in a) print k,a[k]}' file2 file1

a 10
b
c 20
d
e 30
f 40

另一种
awk
和不太聪明的方法

$ awk 'NR==FNR {a[$1]=$2; next} 
       $1 in a {$2=a[$1]; delete a[$1]} 
               1; 
       END     {for(k in a) print k,a[k]}' file2 file1

a 10
b
c 20
d
e 30
f 40

不确定
awk
是否是OP的硬性要求,但这里有一个使用
join
的替代解决方案,它似乎更适合手头的工作(正如@Shelleter也指出的):


不确定
awk
是否是OP的硬性要求,但这里有一个使用
join
的替代解决方案,它似乎更适合手头的工作(正如@Shelleter也指出的):


控制输出的逻辑是什么?“我尝试过使用awk”。。您需要在Q中包含代码,以便我们可以帮助修复它!否则,请尝试搜索
[linux]join
[bash]join
并阅读
man join
。祝你好运。控制输出的逻辑是什么?“我尝试过使用awk”。。您需要在Q中包含代码,以便我们可以帮助修复它!否则,请尝试搜索
[linux]join
[bash]join
并阅读
man join
。祝你好运