4

输入.txt

1,Ram,Fail
2,John,Fail
3,Ron,Success

param.txt(新输入)

1,Sam,Success
2,John,Sucess

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

输出.txt

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 

但它正在合并文件内容。

4

5 回答 5

4

这可能对您有用(GNU sed):

 sed 's|^\([^,]*,\).*|/^\1/c\\&|' param.txt | sed -f - input.txt

解释:

  • 使用第一个字段作为地址转换param.txt为脚本,以更改.sedinput.txts|^\([^,]*,\).*|/^\1/c\\&|
  • 针对input.txt.sed -f - input.txt
于 2012-05-31T06:22:12.323 回答
4

这可以通过一次调用来完成sort

sort -t, -k1,1n -us param.txt input.txt

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

于 2012-05-31T14:00:01.773 回答
2

您可以使用 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 中的字段。

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

于 2012-05-31T06:34:51.107 回答
2

纯 awk 并不是真正适合这项工作的工具。如果您必须只使用 awk,https://stackoverflow.com/a/5467806/1301972是您努力的一个很好的起点。

但是,Unix 提供了一些工具来帮助 awk 为您尝试做的事情提供正确的输入。

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

基本上,您正在为 awk 提供一个文件,其中包含在 input.txt 中的键上连接的行。然后 awk 可以解析出您想要正确显示或重定向到输出文件的字段。

于 2012-05-31T06:42:15.463 回答
2

这应该适用于awk

awk -F"," 'NR==FNR{a[$1]=$0;next} ($1 in a){ print a[$1]; next}1' param.txt input.txt

测试:

$ cat input.txt 
1,Ram,Fail
2,John,Fail
3,Ron,Success
$ cat param.txt 
1,Sam,Success
2,John,Sucess
$ awk -F"," 'NR==FNR{a[$1]=$0;next} ($1 in a){ print a[$1]; next}1' param.txt input.txt 
1,Sam,Success
2,John,Sucess
3,Ron,Success
于 2012-05-31T13:41:27.313 回答