Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 一列中存在的匹配模式应替换为第二个文件的条目_Bash_Awk_Sed_Replace - Fatal编程技术网

Bash 一列中存在的匹配模式应替换为第二个文件的条目

Bash 一列中存在的匹配模式应替换为第二个文件的条目,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

我有两个文件 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   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等。