텍스트 파일의 문자열 목록에 제공된 문자열 줄을 제거하기 위해 sed를 반복합니다.

텍스트 파일의 문자열 목록에 제공된 문자열 줄을 제거하기 위해 sed를 반복합니다.

텍스트 파일에 나열된 종이 내 OTU 테이블에서 발견되면 OTU 테이블의 전체 행을 삭제하기 위해 이 sed 스크립트를 사용하고 있습니다.

현재 작동하지 않는 스크립트는 아래에 있지만 작동하게 할 수는 없습니다. 어쨌든, 가능한 한 빨리 도와주시면 정말 감사하겠습니다.

(각 행을 읽고 내 테이블에서 검색한 후 행 삭제, infile)

for i in $(cat /my/path/species.txt); do 
    sed -i '/"$i"/d' /my/path/ITS.OTU.table.tsv
done

매우 감사합니다

답변1

grep -v -xF -f /my/path/species.txt /my/path/ITS.OTU.table.tsv >/my/path/ITS.OTU.table.tsv.new

이렇게 하면 쓸 수 있습니다 /my/path/ITS.OTU.table.tsv.new. 그 내용은 원본 파일과 동일합니다 /my/path/species.txt.

-xF옵션은 동일한 문자열의 전체 행 일치를 강제하고 -f filename지정된 파일에서 일치하는 행을 읽습니다. -v일치의 의미를 뒤집어서 줄만 남게 합니다.아니요일치하면 반환됩니다.

/my/path/species.txt읽은 문자열이 일치할 수 있도록 일치를 완화해야 하는 경우어딘가에각 줄에서 옵션 /my/path/ITS.OTU.table.tsv을 제거하십시오 -x.

각 행에서 일치 항목을 테스트해야 하는 위치를 알고 있다면 awk해당 데이터 비트를 비교할 수 있지만 현재는 데이터가 어떻게 보이는지 알 수 없습니다.

답변2

이것은 귀하의 스크립트입니다:

while read -r line 
do
    echo $line
    sed -i "/$line/d" /my/path/ITS.OTU.table.tsv
done < /my/path/species.txt

echo $line은 디버깅상의 이유로 더 많았으므로 결국 제거했습니다.

답변3

MacOS/BSD/Solaris와 같은 Unix의 경우 Emilie가 겪었던 문제를 피하기 위해 빈 문자열을 전달해야 하므로 sed대답은 다음과 같습니다.

while read -r line 
do
    echo $line
    sed -i "" "/$line/d" /my/path/ITS.OTU.table.tsv
done < /my/path/species.txt

관련 정보