從一個文件中尋找另一個文件中的字串(如果不存在),然後從原始文件中刪除

從一個文件中尋找另一個文件中的字串(如果不存在),然後從原始文件中刪除

我正在嘗試製作一個腳本來查看一個文件的每一行,如果某一行無法匹配另一個文本文件的任何行中的任何位置,則從原始文件中刪除該行。

此腳本所需的輸入和輸出的範例如下:

輸入範例:文件 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

相關內容