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

Awk 比较两个文件中的两列并打印两个输入文件中的混合列,awk,Awk,我知道这是一个常见的问题,但我被一个简单的解决方案绊倒了 我想将TEST\u FILE\u 2.csv中的1列和2列与TEST\u FILE\u 1.csv中的2列和3列进行匹配,并为匹配行打印TEST\u FILE\u 2.csv中的第1列和第2列,然后是TEST\u FILE\u 1.csv中的第4列和第5列,最后是第3列从测试文件\u 2.csv 我找了很多方法,但总是找不到。请参阅下面我的最新成果 awk -F ',' 'NR==FNR{ a[$2,$3]=$4; next } { s=

我知道这是一个常见的问题,但我被一个简单的解决方案绊倒了

我想将
TEST\u FILE\u 2.csv中的
1列和2列与
TEST\u FILE\u 1.csv中的
2列和3列进行匹配,并为匹配行打印
TEST\u FILE\u 2.csv中的
第1列和第2列,然后是
TEST\u FILE\u 1.csv中的
第4列和第5列,最后是
第3列
测试文件\u 2.csv

我找了很多方法,但总是找不到。请参阅下面我的最新成果

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\u file\u 2
中的整行,只打印
test\u file\u 1
中的
列4
(而不是按所需的顺序)。非常感谢你的帮助

测试文件\u 1.csv

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
测试文件\u 2.csv

181,353,25
181,359,66
185,260,55
189,361,12
181,368,3
期望输出

181,353,1709825.639,5683471.356,25
181,359,1709915.639,5683471.356,66
181,368,1710050.639,5683471.356,3
电流输出

181,353,25 1709825.639
181,359,66 1709915.639
181,368,3 1710050.639
这可以做到:

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和存储列3,id为列1和列2
  • ($2,$3)在
    测试中,如果在数组中找到文件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$2
从阵列中的文件2中捕获信息,然后在检查文件2中是否存在组合时使用组合的
$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和
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

这是更多或更少的100%我所做的文章,只是你们错过了最后一个领域。25,66,3不要错过上一篇专栏文章,请再次阅读我的帖子。您的线路
1813531709825.6395683471.356
我的线路
1813531709825.6395683471.356,25
我确实错过了,然后修复了它--谢谢您抓到了它。然后它将像我的一样……在您删除逗号分隔的
$1,$2
之后,您的第二次尝试将是类似的。谢谢您的快速回复。它们似乎都能工作,但无论我在哪里打开,输出都会在下一行显示最后一列,如果我只是运行它而没有写入新文件,我就不会得到最后一列?有什么想法吗?@charliemit011也许你的文件是dos格式的?尝试
dos2linux文件
。我刚刚复制并粘贴了上面的示例,效果很好。效果非常好谢谢你的支持help@charliemit011如果答案有效,那么你可以接受:)@oguzismail修复了,变得更加健壮。在建议的副本中,有多个答案说明了如何解决这个问题。您只需重新定义字段分隔符。