合并两个文件并保留不匹配的行

问题描述 投票:0回答:1

我正在研究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),不显示歌手的全名。我的脚本有问题吗?

bash awk
1个回答
0
投票

您应该使用以下代码,我对您的尝试进行了较小的更改。

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尝试输入的代码的问题:

  • OP为可见数组创建索引为$ 1(正确),但使值仅为$ 2,这是不正确的,因为$ 2仅捕获JohnMariah,依此类推。
  • 这就是OP尝试未提供完整输出的原因。

在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(除第一列外,这是整行的内容。

© www.soinside.com 2019 - 2024. All rights reserved.