Bash 使用awk比较两个文件并从中提取信息
cat文件1: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
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
。祝你好运