Bash 如何根据匹配的键字段将文本文件中的行替换为另一个文件中的行?

Bash 如何根据匹配的键字段将文本文件中的行替换为另一个文件中的行?,bash,unix,sed,awk,Bash,Unix,Sed,Awk,input.txt 1,Ram,Fail 2,John,Fail 3,Ron,Success 1,Sam,Success 2,John,Sucess 1,Sam,Success 2,John,Sucess 3,Ron,Success param.txt(新输入) 现在我想用param.txt中的整行替换input.txt中的整行。 第一列将充当主键 Output.txt 1,Ram,Fail 2,John,Fail 3,Ron,Success 1,Sam,Success 2,John,S

input.txt

1,Ram,Fail
2,John,Fail
3,Ron,Success
1,Sam,Success
2,John,Sucess
1,Sam,Success
2,John,Sucess
3,Ron,Success
param.txt(新输入)

现在我想用param.txt中的整行替换input.txt中的整行。 第一列将充当主键

Output.txt

1,Ram,Fail
2,John,Fail
3,Ron,Success
1,Sam,Success
2,John,Sucess
1,Sam,Success
2,John,Sucess
3,Ron,Success
我试着

awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' input.txt param.txt > Output.txt 
但它正在合并文件内容

这可能适合您(GNU-sed):

说明:

  • 使用第一个字段作为地址,将
    param.txt
    转换为
    sed
    脚本,以更改
    input.txt
    中的行<代码>s\\([^,]*,\).\/^\1/c\\&
  • 针对
    input.txt
    运行脚本
    sed-f-input.txt
    • 您可以使用join(1)来实现此功能:

      $ join -t, -a1 -j1 Input.txt param.txt | sed -E 's/,.*?,.*?(,.*?,.*?)/\1/'
      1,Sam,Success
      2,John,Sucess
      3,Ron,Success
      
      sed作为一个管道尾部,将Input.txt中的字段从替换的行中剥离出来


      只有当两个输入文件都按第一个字段排序时,这才有效。

      纯awk并不是该作业的正确工具。如果你必须只使用awk,这是你努力的一个很好的起点

      但是,Unix提供了一些工具,可以帮助awk为您尝试执行的操作提供正确的输入

      $ join -a1 -t, <(sort -n input.txt) <(sort -n param.txt) |
           awk -F, 'NF > 3 {print $1 "," $4 "," $5; next}; {print}'
      

      $join-a1-t,这应该适用于
      awk

      awk -F"," 'NR==FNR{a[$1]=$0;next} ($1 in a){ print a[$1]; next}1' param.txt input.txt
      
      测试:
      只需调用一次
      排序
      ,即可完成此操作:

      sort -t, -k1,1n -us param.txt input.txt
      
      在第一个逗号分隔的字段上使用稳定的数字排序,并在
      input.txt
      之前列出
      param.txt
      ,以便在消除重复项时首选正确、较新的行