我有一个包含 >19 000 行的文件,其结构如下:
$ head -10 a_vt
9999.77,-83.03,-7.71771771772,276.97,-7.71771771772
9999.48,-83.57,-7.23723723724,276.43,-7.23723723724
9999.08,-83.99,-7.2972972973,276.01,-7.2972972973
9998.75,-81.71,-6.996996997,278.29,-6.996996997
9998.75,-81.65,-6.996996997,278.35,-6.996996997
9998.69,-80.87,-8.7987987988,279.13,-8.7987987988
9998.34,-81.05,-8.43843843844,278.95,-8.43843843844
9997.89,-83.99,-6.21621621622,276.01,-6.21621621622
9997.77,-77.27,-16.1261261261,282.73,-16.1261261261
9997.54,-82.43,-4.29429429429,277.57,-4.29429429429
...
...
并使用这种类型的文件(即通常具有可变行数的文件):
$ cat b_vm
22850,39.78686TN,39.78686TN,-75.6259,-14.9867,284.374,-14.9867
22901.9,9.90099TN,9.90099TN,-75.649,-14.9636,284.351,-14.9636
27742.2,160.0TN,160.0TN,-75.5999,-14.9922,284.4,-14.9922
22901.9,110.0TN,110.0TN,-75.6648,-14.9526,284.335,-14.9526
9998.69,110.0TN,110.0TN,-75.6551,-14.9496,284.345,-14.9496
9998.34,100.0TN,100.0TN,-75.62949999999998,-14.9573,284.37,-14.9573
27742.2,90.0TN,90.0TN,-75.60129999999998,-14.9973,284.399,-14.9973
27685.3,90.0TN,90.0TN,-75.6024,-14.9626,284.398,-14.9626
27742.2,80.0TN,80.0TN,-75.6014,-15.0006,284.399,-15.0006
22901.9,80.0TN,80.0TN,-75.6597,-14.9626,284.34,-14.9626
匹配第一列的值后,将 19k 行文件过滤掉,以获得:
$ awk 'NR==FNR { a[$1]; next }( ($1 in a) ) { print }' FS="," b_vm a_vt
9998.69,-80.87,-8.7987987988,279.13,-8.7987987988
9998.34,-81.05,-8.43843843844,278.95,-8.43843843844
我不是awk
这里的专家,但我知道这个单行 awk 调用允许在比较两个文件中第一列的值后从缓存中获取值。问题是打印第二列b_vmt
以及如下:
9998.69,-80.87,-8.7987987988,279.13,-8.7987987988,**110.0TN**
9998.34,-81.05,-8.43843843844,278.95,-8.43843843844,**100.0TN**
任何提示都非常受欢迎,
你可以使用这个
awk
:这里按索引
a[$1] = $2
存储$2
在数组中。在第二遍中,我们打印文件中完整记录后的存储值。a
$1
a[$1]
a_vt
了解这一单行 awk 调用允许从缓存中获取值
这不是真的。处理第一个文件时,对于您正在执行的每一行
第一部分仅引用元素,该元素可能尚不存在。来自(GNU Awk 用户指南
因此,执行此操作后,每个键的值
a
都是空字符串。