我正在尝试制作一个脚本来查看一个文件的每一行,如果某一行无法匹配另一个文本文件的任何行中的任何位置,则从原始文件中删除该行。
该脚本所需的输入和输出的示例如下:
输入示例:文件 1(组文件),
hello
hi hello
hi
great
interesting
file 2:
this is a hi you see
this is great don't ya think
sometimes hello is a good expansion of its more commonly used shortening hi
interesting how brilliant coding can be just wish i could get the hang of it
示例脚本输出 - 文件 1 更改为:
hello
hi
great
interesting
所以它被删除了hi hello
,因为它不存在于第二个文件中
这是脚本,它似乎可以工作到创建变量的程度。
#take first line from stability.contigs.groups
echo | head -n1 ~/test_folder/stability.contigs.groups > ~/test_folder/ErrorFix.txt
#remove the last 5 character
sed -i -r '$ s/.{5}$//' ~/test_folder/ErrorFix.txt
#find match of the word string in errorfix.txt in stability.trim.contigs.fasta if not found then delete the line containing the string in stability.contigs.groups
STRING=$(cat ~/test_folder/MothurErrorFix.txt)
FILE=~/test_folder/stability.trim.contigs.fasta
if [ ! -z $(grep "$STRING" "$FILE") ]
then
perl -e 's/.*\$VAR\s*\n//' ~/test_folder/stability.contigs.groups
fi
答案1
如果你有gnu grep
你可以运行:
grep -oFf file1 file2 | sort | uniq | grep -Ff - file1
grep
如果不需要保留 中行的顺序,请删除最后一个file1
。
如果您无权访问gnu grep
, ,则awk
:
awk 'NR==FNR{z[$0]++;next};{for (l in z){if (index($0, l)) y[l]++}}
END{for (i in y) print i}' file1 file2
答案2
如果您有,请寻求 don_crissti(已接受)的答案GNU grep
。以防万一您不这样做(例如在标准 Mac OS X 上,这不起作用),您也可以将此代码片段保存到 bash 脚本中,例如myconvert.sh
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
if ! grep -Fq "$line" $2
then
sed -i '' "/$(echo $line | sed -e 's/[]\/$*.^|[]/\\&/g')/d" $1
fi
done < "$1"
以两个文件作为参数调用它
./myconvert.sh file1 file2
但是,请注意下面 don_crissti 关于 while/read 的使用以及调用的明显性能缺陷的专业评论sed
。