한 파일의 각 줄을 살펴보는 스크립트를 만들려고 하는데 다른 텍스트 파일의 어느 줄에서나 줄이 일치하지 않으면 원본 파일에서 해당 줄을 제거합니다.
이 스크립트에서 원하는 입력 및 출력의 예는 다음과 같습니다.
입력 예: 파일 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
.