基于具有有限列的第二列表的内容编辑一个列表的内容

时间:2016-09-30 10:32:34

标签: linux bash awk sed grep

我正在尝试删除列表A中与列表B中的行不匹配的所有行。

我的问题是两个列表的格式仅对前16列相同。

我只想按这些初始列比较列表,但我想保留列表A中每个匹配行的全部内容。

两个清单的示例内容:

列表A:

2009-02-07T18:54:59.010Z,-5.878,146.884,34,6.3,mwc
2009-02-09T14:09:05.110Z,-5.902,146.967,35,5.8,mwc
2009-02-10T07:29:33.500Z,-22.82,-68.484,103,5.7,mwc

列表B:

2009-02-09T14:09
2009-02-11T09:31
2009-02-11T13:52

我最初的想法是使用grep -F来做到这一点,但我没有运气。有没有办法用awk或sed做到这一点?

干杯。

2 个答案:

答案 0 :(得分:0)

这假设列表A中的行相对于前16个字符是唯一的(如果不是,您只想打印最新的字符)。此外,如果重复列表B中的行,则输出也将重复列表A中的行。

$ awk -F: 'NR==FNR{a[$1 $2]=$0; next} ($1 $2) in a {print a[$1 $2]}' a.txt b.txt
2009-02-09T14:09:05.110Z,-5.902,146.967,35,5.8,mwc

答案 1 :(得分:0)

grep足够简单,只要您想要匹配第一个文件中第二个文件中的文本(或者仅在开始时出现模式)

$ cat f1
2009-02-07T18:54:59.010Z,-5.878,146.884,34,6.3,mwc
2009-02-09T14:09:05.110Z,-5.902,146.967,35,5.8,mwc
2009-02-10T07:29:33.500Z,-22.82,-68.484,103,5.7,mwc

$ cat f2
2009-02-09T14:09
2009-02-11T09:31
2009-02-11T13:52

$ grep -Ff f2 f1
2009-02-09T14:09:05.110Z,-5.902,146.967,35,5.8,mwc