比较两个文件中的两列并打印两个输入文件中的列混合

时间:2019-09-03 05:13:54

标签: awk

我理解这是一个普遍的问题,但是我想提出一个简单的解决方案。

我想将1 and 2中的TEST_FILE_2.csv列与2 and 3中的TEST_FILE_1.csv列进行匹配,并为匹配的行从columns 1 and 2中打印TEST_FILE_2.csv {{1}的columns 4 and 5,最后是TEST_FILE_1.csv的{​​{1}}。

我已经搜索了很多方法,但是一直很简短。在下面查看我的最新工作

column 3

我坚持只打印TEST_FILE_2.csv的{​​{1}}和awk -F ',' 'NR==FNR{ a[$2,$3]=$4; next } { s=SUBSEP; k=$1 s $2 }k in a{ print $0,a[k] }' text_file1.txt.txt text_file2.txt.txt > TESTDUMMY 中的test_file_2的整行(而不是按期望的顺序)。非常感谢您的帮助。

test_file_1.csv

column 4

test_file_2.csv

test_file_1

所需的输出

302932,181,352,1709810.639,5683471.356
302933,181,353,1709825.639,5683471.356
302934,181,354,1709840.639,5683471.356
302935,181,355,1709855.639,5683471.356
302936,181,356,1709870.639,5683471.356
302937,181,357,1709885.639,5683471.356
302938,181,358,1709900.639,5683471.356
302939,181,359,1709915.639,5683471.356
302940,181,360,1709930.639,5683471.356
302941,181,361,1709945.639,5683471.356
302942,181,362,1709960.639,5683471.356
302943,181,363,1709975.639,5683471.356
302944,181,364,1709990.639,5683471.356
302945,181,365,1710005.639,5683471.356
302946,181,366,1710020.639,5683471.356
302947,181,367,1710035.639,5683471.356
302948,181,368,1710050.639,5683471.356
302949,181,369,1710065.639,5683471.356
302950,181,370,1710080.639,5683471.356

电流输出

181,353,25
181,359,66
185,260,55
189,361,12
181,368,3

2 个答案:

答案 0 :(得分:1)

这可以做到:

awk -F, 'FNR==NR {a[$1,$2]=$3;next} ($2,$3) in a {print $0","a[$2,$3]}' test_file_2.csv test_file_1.csv
302933,181,353,1709825.639,5683471.356,25
302939,181,359,1709915.639,5683471.356,66
302948,181,368,1710050.639,5683471.356,3
  • FNR==NR {a[$1,$2]=$3;next}读取文件2和存储在ID为1列和2列的数组中的第3列
  • ($2,$3) in a测试是否在数组中找到文件1的第2列和第3列
  • 如果是,则从文件1打印行,从文件2打印字段3

如果不需要文件1中的第一列,则可以执行以下操作:

awk -F, -v OFS=, 'FNR==NR {a[$1,$2]=$3;next} ($2,$3) in a {print $2,$3,$4,$5,a[$2,$3]}' test_file_2.csv test_file_1.csv
awk -F, 'FNR==NR {a[$1,$2]=$3;next} ($2,$3) in a {f=a[$2,$3];sub(/^[^,]+,/,"");print $0","f}' test_file_2.csv test_file_1.csv
181,353,1709825.639,5683471.356,25
181,359,1709915.639,5683471.356,66
181,368,1710050.639,5683471.356,3

答案 1 :(得分:0)

您很近,但是在这里您需要使用组合的$1$2来捕获数组中file2的信息,然后在检查组合是否存在于file2中时使用组合的$2$3,例如

awk -F, -v OFS=, '
    NR==FNR {a[$1$2]=$3; next} 
    $2$3 in a {print $2,$3,$4,$5,a[$2$3]}
' tf2.csv tf1.csv

使用/输出示例

分别将文件放在tf1.csv and tf2.csv中,您只需将鼠标粘贴/中键粘贴到终端中进行测试即可,例如

$ awk -F, -v OFS=, '
>     NR==FNR {a[$1$2]=$3; next}
>     $2$3 in a {print $2,$3,$4,$5,a[$2$3]}
> ' tf2.csv tf1.csv
181,353,1709825.639,5683471.356,25
181,359,1709915.639,5683471.356,66
181,368,1710050.639,5683471.356,3