존재하지 않는 경우 한 파일에서 다른 파일의 문자열을 찾아 원본 파일에서 삭제합니다.

존재하지 않는 경우 한 파일에서 다른 파일의 문자열을 찾아 원본 파일에서 삭제합니다.

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

이 스크립트에 필요한 입력 및 출력의 예는 다음과 같습니다.

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

그러나 while/read 사용 및 호출의 명백한 성능 단점에 관한 아래 don_crissti의 전문가 의견을 참고하세요 sed.

관련 정보