![删除与文件中的单词匹配的行](https://linux22.com/image/183269/%E5%88%A0%E9%99%A4%E4%B8%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%8D%95%E8%AF%8D%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C.png)
我有一个包含与我的模式相对应的不同单词的文件
文字.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