one
pl
a
ff
c
b
nn2
b
a
z
k
c
d我想从第一个文件中删除第二个文件中的所有行(公共行)。我想维持file_one线路的秩序。
可以在逐行检查模式下工作,如下所示:
while read line; do
if ! grep $line two; then
echo $line >> one_only
fi
done < one但这可能不是快速检查的最佳选择。另一种方法是对先前排序的文件使用"comm“命令:
comm -1 -2 <(sort one) <(sort two) \
| tr '\n' '\|' \
| sed 's/|/\\|/g;s/\\|$/\n/' \
> common_lines
grep -v "$(cat common_lines)" one第一个命令创建一个“逻辑或模式”:
a\|b\|c它可以与grep一起重用,以从"one“文件中排除公共行。这样,“一”行的原有顺序就得以保留。其结果是:
pl
ff
nn你能提出其他的想法来减少计算时间吗?
实际输入文件的填充量要大得多,并且包含简短的名称(软件名称):
blender
gimp
vim
emacs
mozilla-firefox
google-earth等等..。
发布于 2022-02-10 17:14:25
使用two的行作为模式,并使用grep
grep -Fx -f two -v one发布于 2022-02-10 19:21:43
awk 'NR==FNR{a[$0]; next} !($0 in a)' two one关于问题中的while read循环,请阅读why-is-using-a-shell-loop-to-process-text-considered-bad-practice
https://stackoverflow.com/questions/71069382
复制相似问题