한 파일에서 다른 파일의 문자열이 없으면 찾은 다음 원본 파일에서 제거하십시오.

한 파일에서 다른 파일의 문자열이 없으면 찾은 다음 원본 파일에서 제거하십시오.

한 파일의 각 줄을 살펴보는 스크립트를 만들려고 하는데 다른 텍스트 파일의 어느 줄에서나 줄이 일치하지 않으면 원본 파일에서 해당 줄을 제거합니다.

이 스크립트에서 원하는 입력 및 출력의 예는 다음과 같습니다.

입력 예: 파일 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

. 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

그러나 while/read 사용법과 호출의 명백한 성능 단점에 관해 아래 don_crissti의 지식이 풍부한 의견을 참고하세요 sed.

관련 정보