我知道有些类似的问题已被提出,但我很难获得awk,加入或其他任何事情来做我想做的事。
我必须以制表符分隔文件。
文件1:
Text1 Text2 Text3
1000 128 128/D59
1001 116 116/A95
每一行都是唯一的,第一列中的每个元素只出现一次。
文件2:
Text1 Text4 Text5 Text6
1000 1003 19901001 1
1000 1002 19901001 2
1001 1003 19971005 0
每一行都是唯一的,但任何元素都可以在文件中多次出现。这两个文件的行和列数明显不同。
我想要的文件3:
Text1 Text4 Text5 Text6 Text2 Text3
1000 1003 19901001 1 128 128/D59
1000 1002 19901001 2 128 128/D59
1001 1003 19971005 0 116 116/A95
列的顺序实际上并不重要。真正的file1有18024188行,而真正的file2有89122313行。 到目前为止我用join或awk做的所有事情都没有像示例中的第二行那样产生一行。我真的不关心使用这两个程序,任何解决方案都适合。如果它会更容易(有人解释我怎么做)我也可以将它转换为sql db并尝试加入它们(我正在尝试一个完整的外连接,对吧?)。
提前致谢
答案 0 :(得分:2)
使用 awk
在 file2 上左外加入
$ awk 'FNR==NR{a[$1]=$2FS$3; next} ($1 in a){print $0,a[$1]; next} {print $0,"NA","NA"}' file1 file2
Text1 Text4 Text5 Text6 Text2 Text3
1000 1003 19901001 1 128 128/D59
1000 1002 19901001 2 128 128/D59
1001 1003 19971005 0 116 116/A95
2000 1003 19971005 0 NA NA
FNR==NR{a[$1]=$2FS$3; next}
:将file1
的内容存储在关联数组a
中,其中键是唯一的字段
($1 in a){print $0,a[$1]}
:迭代file2
时检查数组中是否存在第一个字段/键。如果是,则在记录旁边打印其值。
如果数组中没有键(例如2000
),则只打印file2
中的记录;这将反映left outer join
上file2
的行为。
内部加入:
$ awk 'FNR==NR{a[$1]=$2FS$3; next} ($1 in a){print $0,a[$1]}' file1 file2
Text1 Text4 Text5 Text6 Text2 Text3
1000 1003 19901001 1 128 128/D59
1000 1002 19901001 2 128 128/D59
1001 1003 19971005 0 116 116/A95