파일과 목록의 두 열을 비교하고 awk로 일치하지 않는 패턴을 인쇄하는 방법

파일과 목록의 두 열을 비교하고 awk로 일치하지 않는 패턴을 인쇄하는 방법

데이터 파일이 있습니다 A.tsv(필드 구분 기호 = \t).

id  mutation
243 siti,toto,mumu
254     
267 lala,siti,sojo
289 lala

및 템플릿 파일 B.txt(필드 구분 기호 = 한 줄과 한 열만 있으므로 중요하지 않음):

lala,siti,mumu

A.tsv나는 (그러나 새 파일에서 C.tsv) 이름 의 새 열을 만들고 싶습니다. 목록에는 없는 열에 mutation_not있는 돌연변이만 인쇄됩니다 .mutationA.tsvB.txt

C.tsv다음과 같습니다:

id  mutation    mutation_not
243 siti,toto,mumu  toto
254     
267 lala,siti,sojo  sojo
289 lala

나는 제외를 시도했습니다 :

awk 'NR==FNR {exclude[$0];next} !($0 in exclude)' file2 file1

하지만 좋은 결과가 없습니다. 아이디어가 있나요? 감사해요

답변1

awk ' BEGIN{OFS="\t"}
NR==FNR{ for(i=1; i<=NF; i++) muts[$i]; next }
FNR>1  { len=split($2, tmp, ",");
         for(i=1; i<=len; i++) buf= buf (tmp[i] in muts?"":(buf==""?"":",") tmp[i])
       }
{ print $0, (FNR==1?"mutation_not":buf); buf="" }' FS=',' fileB FS='\t' fileA

답변2

사용 gawk:

awk 'BEGIN{OFS="\t"; }
NR==FNR{ar[$1]=$1;next}
FNR==1{$(NF+1) = "mutation_not"}
FNR>1{split($2,a,","); 
for(i in a) if (a[i] in ar) ; 
else ncol[$1] = (ncol[$1])? ncol[$1] "," a[i] : a[i]; 
$(NF+1) = ncol[$1]}1' 
RS="," B.txt  RS="\n" FS="\t" A.tsv

모든 필드가 쉼표로 구분되고 한 줄만 있다고 가정하면 레코드 구분 기호( RS)는 파일에 대해 쉼표로 설정됩니다 B.txt.

NR==FNR{ar[$1]=$1;nextar첫 번째 파일의 첫 번째 필드에 인덱스가 있는 배열을 만듭니다 .

FNR==1{$(NF+1) = "mutation_not"헤더 이름에 열을 하나 더 생성합니다.

FNR>1{split($2,a,",")의 두 번째 필드를 A.tsv배열로 분할합니다 a.

존재하지 않는 다음 항목은 배열 B.txt에 저장됩니다 ncol. $(NF+1) = ncol[$1]array 요소로 열을 하나 더 만듭니다 ncol.

답변3

setB.txt 파일의 쉼표로 구분된 요소로 s2를 구성합니다.

그런 다음 A.tsv의 각 줄에 대해 두 번째 필드를 집합으로 변환하고 여기에서 s2 집합을 뺍니다. 이로 인해 B.txt에서는 발견되지 않는 A.tsv에 존재하는 돌연변이가 발생합니다. 그런 다음 결과 요소를 결합하고 원래 줄과 함께 인쇄합니다.

python3 -c 'import sys
tsv,txt = sys.argv[1:]
fs,rs = "\t","\n"
ofs,dlm = fs,","

with open(txt) as fh, open(tsv) as f:
  s2 = set(*list(map(lambda x:x.rstrip(rs).split(dlm),fh.readlines())))

  for nr,ln in enumerate(f,1):
    l = ln.rstrip(rs)
    if nr == 1: print(l,"mutation_not",sep=ofs)
    else:
      F = l.split(ofs)
      if len(F) < 2: print(l)
      else: print(l,
  dlm.join({*F[1].split(dlm)}-s2),sep=ofs)

' A.tsv B.txt

결과:

id  mutation    mutation_not
243 siti,toto,mumu  toto
254
267 lala,siti,sojo  sojo
289 lala    

이번에는 Gnu sed 편집기를 사용하여 결과를 얻습니다.

sed -Ee '
  1{h;d;}
  2s/\tmutation$/&&_not/;t

  s/\t\S+$/&&,/;T;G
  s/\t/\n/2;ta

  :a
  s/\n([^,]+),(.*\n(.*,)?\1(,|$))/\n\2/;ta
  s/\n([^,\n]+),/\t\1\n/;ta

  s/\n.*//
' B.txt A.tsv

Btxt 파일이 보류 상태로 저장되고(한 줄로 가정) A.tsv의 각 줄에 B.txt 내용이 추가되고 B.txt에서 발견되는 변형이 표시됩니다. 모든 돌연변이를 살펴본 후 해당 라인이 인쇄됩니다.

관련 정보