bash:使用同一文件中的2个变量和sed

时间:2017-09-25 01:48:02

标签: bash sed multiple-columns

我有2个文件:

file1.txt
rs142159069:45000079:TACTTCTTGGACATTTCC:T 45000079
rs111285978:45000103:A:AT 45000103
rs190363568:45000168:C:T 45000168

file2.txt
rs142159069:45000079:TACTTCTTGGACATTTCC:T rs142159069
rs111285978:45000103:A:AT rs111285978
rs190363568:45000168:C:T rs190363568

使用file2.txt,我想用第2列中的条目替换名称(file1.txt的column2,即file2.txt的column1)。输出文件将是:

rs142159069 45000079
rs111285978 45000103
rs190363568 45000168

我尝试输入file2.txt的列但没有成功:

while read -r a b
do
cat file1.txt | sed s'/$a/$b/'
done < file2.txt

我是bash的新手。此外,不知道如何使用我的命令编写输出文件。任何帮助都将深表感谢。

2 个答案:

答案 0 :(得分:0)

在您的情况下,如果您愿意接受没有awk的答案,则使用perlsed会更容易:

awk '(NR==FNR){out[$1]=$2;next}{out[$1]=out[$1]" "$2}END{for (i in out){print out[i]} }' file2.txt file1.txt > output.txt

output.txt:

rs142159069 45000079
rs111285978 45000103
rs190363568 45000168

注意:这假设column1中的所有符号都是唯一的,并且它们都存在于两个文件中

说明:

  • (NR==FNR){out[$1]=$2;next}:在解析第一个文件时,创建一个名称从第一列作为键的地图
  • {out[$1]=out[$1]" "$2}:追加第二列的值
  • END{for (i in out){print out[i]} }:打印地图中的所有值

答案 1 :(得分:0)

显然$2 file2属于$1 file1的一部分,因此您可以使用awk并重新定义FS

$ awk -F"[: ]" '{print $1,$NF}' file1
rs142159069 45000079
rs111285978 45000103
rs190363568 45000168