比较两列并在第二个文件中打印第二列

时间:2014-09-29 08:34:04

标签: linux shell unix awk

我需要比较两个文件的前两列,如果结果相同,则需要将第一个文件的第二列打印到第一个文件中所有匹配的第二个文件中。

输入:

cat sample.txt
135,135-00
135,135-13
135,135-134
235,120-23
235,190-56

cat dump_test.csv
135,121,4,VA,date,date
135,128,6,VA,date,date
135,131,9,VA,date,date
235,128,10,date,date

输出文件:

cat output.txt
135,121,4,VA,date,date,135-00
135,128,6,VA,date,date,135-00
135,131,9,VA,date,date,135-00
135,121,4,VA,date,date,135-13
135,128,6,VA,date,date,135-13
135,131,9,VA,date,date,135-13
135,121,4,VA,date,date,135-134
135,128,6,VA,date,date,135-134
135,131,9,VA,date,date,135-134
235,128,10,date,date,120-23
235,128,10,date,date,190-56

2 个答案:

答案 0 :(得分:2)

这对你好吗?

join -t',' test sample

输出:

135,121,4,VA,date,date,135-00
135,121,4,VA,date,date,135-13
135,121,4,VA,date,date,135-134
135,128,6,VA,date,date,135-00
135,128,6,VA,date,date,135-13
135,128,6,VA,date,date,135-134
135,131,9,VA,date,date,135-00
135,131,9,VA,date,date,135-13
135,131,9,VA,date,date,135-134
235,128,10,date,date,120-23
235,128,10,date,date,190-56

答案 1 :(得分:2)

$ awk -F, 'BEGIN{i=0}FNR==NR{first[i]=$0; i=i+1;}NR!=FNR{for(j=0;j<i;j++){split(first[j],line); if(line[1]==$1) print $0,line[2]}}' sample.txt dump_test.csv

135,121,4,VA,date,date 135-00
135,121,4,VA,date,date 135-13
135,121,4,VA,date,date 135-134
135,128,6,VA,date,date 135-00
135,128,6,VA,date,date 135-13
135,128,6,VA,date,date 135-134
135,131,9,VA,date,date 135-00
135,131,9,VA,date,date 135-13
135,131,9,VA,date,date 135-134
235,128,10,date,date 120-23
235,128,10,date,date 190-56

它做什么?

简而言之

从第一个文件first

中的每一行创建一个数组sample.txt

对于第二个文件dumb_test中的每一行,它检查第一个字段是否在第一个字段中,如果是,则将第二个列首先附加到该行并打印。

FNR==NR确保以下命令仅适用于第一个文件sample.txt

first是一个数组,用于保存文件1中的每一行sample.txt,并使用i

进行索引

first[i]=$0将整行复制到数组中,并递增索引i

NR!=FNR可确保对第二个文件dumb_test.csv

执行以下命令

for遍历数组first,即第一个文件中的行。

split(first[j],line) first[i]进入数组line

例如first[0] = 135,135-00

split(first[0], line)line[1] = 135line[2] = 135-00 这里line[1]是第一列,line[2]是第一个文件的第二列

if检查文件一line[1] == $1中第一列的sample.txt是否等于第二个文件中的第一列dumb_test.csv

如果是,则在第二个文件中打印整行,$0附加第一个文件的第二个列,行[2]

print $0,line[2]