我有两个文件(均以制表符分隔):
database.txt
MAR001;string1;H
MAR002;string2;G
MAR003;string3;Hdata.txt
data1;MAR002
data2;MAR003我想使用MAR###列合并这两个表。预期输出(制表符分隔):
data1;MAR002;string2;G
data2;MAR003;string3;H我想使用awk;这是我的尝试:
awk 'BEGIN{FS=OFS="\t"} FNR == NR { a[$2] = $1; next } $2 in a { print $0, a[$1] }' data.txt database.txt但这失败了..。
发布于 2017-08-01 19:23:37
awk -F '\t' 'FNR==1 && NR == 1 { strt=1 } FNR==1 && NR != 1 { strt=0} strt==1 {dat[$1]=$2";"$3 } strt==0 { if ( dat[$2] != "" ) { print $1";"$2";"dat[$2] } }' database.txt data.txt首先读取database.txt,然后将数据读取到数组dat中。然后,当我们遇到data.txt文件时,检查dat数组中的条目并打印所需的数据(如果有)。
输出:
data1;MAR002;string2;G
data2;MAR003;string3;H发布于 2017-08-01 19:19:39
我将只使用join命令。这很简单:
join -t \; -1 1 -2 2 database.txt data.txt
MAR002;string2;G;data1
MAR003;string3;H;data2您可以使用-o指定输出列的顺序。例如:
join -t \; -1 1 -2 2 -o 2.1,2.2,1.2,1.3 database.txt data.txt
data1;MAR002;string2;G
data2;MAR003;string3;H附言:我假设你的文件是“分号分隔的”,而不是“制表符分隔的”。此外,您的文件还需要按键列排序。
发布于 2017-08-01 19:15:12
首先,;和\t是不同的字符。如果您的实际输入文件是制表符分隔的,以下是代码的修复方法:
将您的代码更改为:
awk '....... $1 in a { print a[$1], $0 }' data.txt database.txthttps://stackoverflow.com/questions/45436132
复制相似问题