Bash 如何根据匹配的键字段将文本文件中的行替换为另一个文件中的行?
input.txtBash 如何根据匹配的键字段将文本文件中的行替换为另一个文件中的行?,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
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
中的行<代码>s\\([^,]*,\).\/^\1/c\\&input.txt
- 针对
运行脚本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
,以便在消除重复项时首选正确、较新的行