匹配2个文件的第一列,输出文件1的第2列和文件2的第2列和第3列

时间:2016-06-19 11:05:14

标签: linux csv text awk

我有2个文件。

文件1具有以下数据:

def!:abcabc:abc123
sdf!:skdfkd:asd432
jkl!:kalsfs:kak323

文件2有这样的数据:

def!:hi123
fjs!:aaaaa123
bab!:kfksfksasdf123

输出应为:

abcabc:abc123:hi123

我编写了以下单行程,但是我正在使用2个数组:

awk -F ':' -v OFS=':' 'FNR==NR{a[$1] = $0;f[$1] = $2;next} ($1 in a) {print $2,$3,f[$1]}' file2 file1 > output

请解释简化版本的工作原理。

此致

Andrew Smith

2 个答案:

答案 0 :(得分:2)

如果您对使用GNU sort和GNU join而不是awk的解决方案感到满意,可以这样做:

join -t: -o 1.2,1.3,2.2 <( sort -t: file1 ) <( sort -t: file2 )

这假定file1file2未排序,因此使用sort

  • 选项-t用于设置joinsort
  • 的分隔符
  • -o选项join选择哪个文件的哪些部分用于输出,加入的信息页面(info join)有更多信息

答案 1 :(得分:1)

了解脚本中a[]的用途:

awk -F ':' -v OFS=':' 'FNR==NR{a[$1] = $0;f[$1] = $2;next} ($1 in a) {print $2,$3,f[$1]}' file2 file1 > output

您将$0保存在a[$1]中,以便将第一个文件的全部内容存储在内存中,但之后您永远不会对$0中存储的a[]值执行任何操作}}。您对a[]所做的一切都是测试$1是否在其中$1 in a,但每次a[$1]=$0 f[$1]=$2时,您$1 in a也会$1 in f所以a[] awk -F ':' -v OFS=':' 'FNR==NR{f[$1] = $2;next} ($1 in f) {print $2,$3,f[$1]}' file2 file1 > output 1}}是真的,$1 in f也必须是真的,那就是你实际使用print语句中内容的数组。所以你可以摆脱FS而只是做:

OFS

它的工作方式与原始脚本完全相同。您不需要awk 'BEGIN{FS=OFS=":"} FNR==NR{f[$1]=$2;next} $1 in f{print $2,$3,f[$1]}' file2 file1 > output 周围的parens,只要您需要2个变量(例如Sub dural() ActiveSheet.Cells.NumberFormat = "General" End Sub div)来获得相同的值,最好将它们一起设置为该值,而不是单独使用所以你的脚本可以更加惯用地写成:

    var marker= new google.maps.Marker({
        position: new google.maps.LatLng(30,30)
      });