从文件B的列表中删除文件A中的所有单词

时间:2018-07-24 10:44:02

标签: bash awk sed

我有两个文件:A和B。

A的内容:

p218    first_departure_date    p219    2017-01-03  p220    sg40    Joe p221    expire_date 222 11-09-2024  p223    dob 224 00-00-0000  p225    gender  226 MR  p227    last_departure_date 228 2017-01-03

文件B中的内容:

p219
p218
p220
p221
p227
p223
p225
p228

预期结果:

first_departure_date    2017-01-03  sg40    Joe expire_date 11-09-2024  dob 00-00-0000  gender  MR  last_departure_date 2017-01-03

现在,我想从文件B中删除文件A中所有出现的行。

我尝试了以下操作:

grep -vxFf fileB fileA > fileC

但是它什么也没做。

3 个答案:

答案 0 :(得分:1)

$ awk '
    NR==FNR { b[$1]; next }
    {
        c = 0
        for (i=1; i<=NF; i++) {
            if ( !($i in b) ) {
                printf "%s%s", (c++ ? OFS : ""), $i
            }
        }
        print ""
    }
' fileB fileA
first_departure_date 2017-01-03 sg40 Joe expire_date 222 11-09-2024 dob 224 00-00-0000 gender 226 MR last_departure_date 228 2017-01-03

答案 1 :(得分:1)

这可能对您有用(GNU sed):

sed 's/[^[:alnum:]]/\\&/g;s/.*/s#&\\s*##g/' fileB | sed -f - fileA

这将使用fileB创建一个sed脚本,该脚本将删除fileB中的所有单词,然后删除fileA中可能的空格。

答案 2 :(得分:0)

awk '{print "s/"$0"//"}' fileB > out
sed -f out fileA -e 's/^[ ]//'

示例输出:

first_departure_date        2017-01-03      sg40    Joe     expire_date 222 11-09-2024      dob 224 00-00-0000      gender  226 MR      last_departure_date 228 2017-01-03