我正在研究sed命令,但是合并两个文件时出现问题。
file1.txt
A 1
C 3
E 5
file2.txt
1 John Lennon
2 Mariah carey
3 Cool & The Gang
4 Westlife
5 Red Hot Chili Peppers
期望的输出
1 John Lennon A
2 Mariah Carey
3 Cool & The Gang C
4 Westlife
5 Red Hot Chili Peppers E
我尝试制作awk脚本,如下所示:
awk 'FNR==NR{seen[$1]=$2; next} $1 in seen{seen[$1]=seen[$1] OFS $2} END{ for (e in seen) print e, seen[e]}' file2.txt file1.txt | sort -V
但是此输出仅显示歌手的一个单词(John,Mariah,Cool,Westlife和Red),不显示歌手的全名。我的脚本有问题吗?
您应该使用以下代码,我对您的尝试进行了较小的更改。
awk 'FNR==NR{val=$1;$1="";sub(/^ +/,"");seen[val]=$0; next} $1 in seen{seen[$1]=seen[$1] OFS $2} END{ for (e in seen) print e, seen[e]}' file2.txt file1.txt | sort -V
或OP的固定代码的非单一衬里形式:
awk '
FNR==NR{
val=$1
$1=""
sub(/^ +/,"")
seen[val]=$0
next
}
($1 in seen){
seen[$1]=seen[$1] OFS $2
}
END{
for(e in seen)
print e, seen[e]
}
' file2.txt file1.txt | sort -V
输出如下。
1 John Lennon
2 Mariah carey
3 Cool & The Gang
4 Westlife
5 Red Hot Chili Peppers
OP尝试输入的代码的问题:
John
或Mariah
,依此类推。在OP的代码上应用的修正:
读取Input_file2文件时将OP的代码从FNR==NR{seen[$1]=$2; next}
更改为FNR==NR{val=$1;$1="";sub(/^ +/,"");seen[val]=$0; next}
。
代码val=$1;$1="";sub(/^ +/,"");seen[val]=$0
代码是什么意思?因为我们需要整行的值不包含数组的索引(第一列),所以首先将$ 1保存到一个名为val
的变量中(以后可以用作数组的索引);然后将第一个字段无效为NULL,并用NULL替换初始空间(该空间将通过在行中无效$ 1来创建)。现在提到将数组索引视为val
,并将值提供为$0
(除第一列外,这是整行的内容。