删除与文件中的单词匹配的行

删除与文件中的单词匹配的行

我有一个包含与我的模式相对应的不同单词的文件

文字.TXT

842
897
907
967
995
1065
1095

以及其他文件,其中包含与 word.txt 匹配时我想要删除的行

816.42743   9246.4688
832.41711   8867.3076
842.51001   23988.459
859.42639   5776.8726
870.53418   5992.9668
875.41742   6930.3584 
877.43384   35639.199 
885.51709   60137.957
891.41595   5480.983

因此,新的填充应该删除第 3 行,因为它与模式的单词 匹配842

最终文件应该是:

816.42743   9246.4688
832.41711   8867.3076
859.42639   5776.8726
870.53418   5992.9668
875.41742   6930.3584 
877.43384   35639.199 
885.51709   60137.957
891.41595   5480.983

我还需要单词的模式(word.txt)仅识别点之前的数字。谢谢,希望能说清楚

答案1

使用一种方式推荐进入 GNU awk 手册解析文件:

awk -F '.' 'pass == 1 {seen[$0]}
            pass == 2 && !($1 in seen)' pass=1 words.txt pass=2 file

第一次,我们将 的每一行 ( $0)保存words.txt为关联数组 的键seen

在第二遍中,我们仅将file第一个字段 ( $1) 不存在的行打印到 中seen

-F '.'将字段分隔符 ( FS) 设置为文字点。

输出:

816.42743   9246.4688
832.41711   8867.3076
859.42639   5776.8726
870.53418   5992.9668
875.41742   6930.3584 
877.43384   35639.199 
885.51709   60137.957
891.41595   5480.983

答案2

awk -F'.' 'NR==FNR{a[$1]; next} !($1 in a)' words.txt file2

答案3

您可以使用 grep,但您需要另一个工具来强制执行“点之前”要求

grep -v -w -f <(sed 's/^/^/' words.txt) file2
  • grep 可以获取包含模式的文件:-f
  • 但我们想要将数字文件转换为正则表达式,因此用 sed 替换该过程
  • 你想匹配整个单词:-w
  • 并且您想要反转匹配:-v

相关内容