Bash 一列中存在的匹配模式应替换为第二个文件的条目
我有两个文件 file1.txtBash 一列中存在的匹配模式应替换为第二个文件的条目,bash,awk,sed,replace,Bash,Awk,Sed,Replace,我有两个文件 file1.txt ID AB AC AD AE L 5 6 7 5 M 4 5 6 4 O 2 4 6 8 P 7 9 6 5 Q 7 8 6 5 file2.txt AB BB AC HG AD ZH AE BE 结果文件.txt ID BB HG ZH BE L 5 6 7 5 M 4 5 6 4 O 2 4 6 8 P
ID AB AC AD AE
L 5 6 7 5
M 4 5 6 4
O 2 4 6 8
P 7 9 6 5
Q 7 8 6 5
file2.txt
AB BB
AC HG
AD ZH
AE BE
结果文件.txt
ID BB HG ZH BE
L 5 6 7 5
M 4 5 6 4
O 2 4 6 8
P 7 9 6 5
Q 7 8 6 5
我如何得到这个输出。我知道sed可以用于替换,但如何将其应用于多个条目。使用awk:
awk 'NR==FNR { arr[$1]=$2 } NR != FNR && FNR == 1 { printf "%s ","ID";for (i=2;i<=NF;i++) { printf "%s ",arr[$i] } } NR != FNR && FNR != 1 { printf "\n%s",$0 }' file2.txt file1.txt
处理file2.txt NR==FNR并创建一个数组arr,该数组使用第一列和第二列中的值编制索引。然后处理第二个文件NR!=FNR对于第一行,从2开始循环通过空格分隔的字段,并打印与数组arr中的索引相对应的值。然后按原样打印行。使用awk:
awk 'NR==FNR { arr[$1]=$2 } NR != FNR && FNR == 1 { printf "%s ","ID";for (i=2;i<=NF;i++) { printf "%s ",arr[$i] } } NR != FNR && FNR != 1 { printf "\n%s",$0 }' file2.txt file1.txt
处理file2.txt NR==FNR并创建一个数组arr,该数组使用第一列和第二列中的值编制索引。然后处理第二个文件NR!=FNR对于第一行,从2开始循环通过空格分隔的字段,并打印与数组arr中的索引相对应的值。然后按原样打印行。这可能适用于您所使用的:
$ sed -E 's/(\S+)\s+(\S+).*/1s#\1#\2#/' file2 | sed -f - file1
使用file2创建sed脚本以转换file1的头。这可能适用于GNU sed:
$ sed -E 's/(\S+)\s+(\S+).*/1s#\1#\2#/' file2 | sed -f - file1
使用file2创建用于转换file1标题的sed脚本。请以代码的形式添加您的工作,我们非常鼓励您这样做,谢谢。要开始,请尝试在bash上进行谷歌搜索,替换多个模式,然后查看冗长的点击列表,寻找符合您要求的想法。请以代码的形式添加您的努力,这是非常受鼓励的,谢谢。要开始使用,请尝试在bash上进行谷歌搜索替换多个模式,然后查看冗长的点击列表,寻找符合您要求的想法。您能解释整个命令吗?@Mendel第一次sed调用将文件2的每一行转换为sed命令,例如,文件2的第一行是AB BB变为1SB这是作为sed脚本传递到第二个sed调用,该调用将第一行从ID AB AC AD AE更改为ID BB AC AD AE等。您能解释整个命令吗?@Mendel第一个sed调用将文件2的每一行转换为sed命令,例如,文件2的第一行是AB BB变为1SABB这是作为sed脚本传递给第二个sed调用,将第一行从ID AB AC AD AE更改为ID BB AC AD AE等。