데이터 파일이 있습니다 A.tsv
(필드 구분 기호 = \t
).
id mutation
243 siti,toto,mumu
254
267 lala,siti,sojo
289 lala
및 템플릿 파일 B.txt
(필드 구분 기호=행과 열이 하나뿐이므로 중요하지 않음):
lala,siti,mumu
나는 was 라는 새 열을 만들고 A.tsv
(그러나 새 파일에 있음 ) 목록에 없는 열에 있는 돌연변이 만 인쇄하고 싶습니다.C.tsv
mutation_not
mutation
A.tsv
B.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;next
ar
첫 번째 파일의 첫 번째 필드로 인덱싱된 배열을 만듭니다.
FNR==1{$(NF+1) = "mutation_not"
헤더 이름에 열을 하나 더 만듭니다.
FNR>1{split($2,a,",")
두 번째 필드를 A.tsv
배열로 분할합니다 a
.
존재하지 않는 다음 항목이 배열에
B.txt
저장됩니다 . array 의 요소를 사용하여 다른 열을 만듭니다 .ncol
$(NF+1) = ncol[$1]
ncol
답변3
set
B.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에서 발견된 돌연변이를 선택한다는 것입니다. 모든 변이를 확인한 후 이 줄이 인쇄됩니다.