awk를 사용하여 새 파일을 만들면 특정 열 1개를 사용하는 데 문제가 발생하고 무엇이 잘못되었는지 알 수 없습니다.

awk를 사용하여 새 파일을 만들면 특정 열 1개를 사용하는 데 문제가 발생하고 무엇이 잘못되었는지 알 수 없습니다.

이 파일을 사용하려고 합니다...

    MT      200610-1        100     2757
    MT      200610-10       100     6753
    MT      200610-100      100     15173

열 1,2,4를 사용하여 다음과 같은 새 파일을 만들고 싶습니다.

    chrMT   2756    2757    200610-1
    chrMT   6752    6753    200610-10
    chrMT   15172   15173   200610-100

처음 3개만 이렇게 하면 작동합니다..

awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' test_ace_geno1.map
    chrMT 2756 2757
    chrMT 6752 6753
    chrMT 15172 15173

마지막에 두 번째 열을 추가하려고 하면 이상한 일이 발생합니다.

awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' test_ace_geno1.map
     200610-16 2757
     200610-10 6753
     200610-100 15173

세트 목록으로 vim을 수행하면 일반 탭으로 표시되므로 전체를 엉망으로 만드는 해당 열에서 무슨 일이 일어나고 있는지 잘 모르겠습니다.

    MT^I200610-1^I100^I2757$
    MT^I200610-10^I100^I6753$
    MT^I200610-100^I100^I15173$

답변1

스타일 dos줄 끝:

$ cat -e ip.txt 
    MT      200610-1        100     2757^M$
    MT      200610-10       100     6753 ^M$
    MT      200610-100      100     15173^M$

$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' ip.txt 
chrMT 2756 2757
chrMT 6752 6753
chrMT 15172 15173

$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' ip.txt 
 200610-16 2757
chrMT 6752 6753 200610-10
 200610-100 15173

스타일 줄 끝과 필요한 출력을 perl모두 처리하려면 다음을 수행 하세요 .dos

$ perl -lane 'print "chr$F[0]\t", $F[3]-1, "\t$F[3]\t$F[1]"' ip.txt 
chrMT   2756    2757    200610-1
chrMT   6752    6753    200610-10
chrMT   15172   15173   200610-100

를 사용하면 먼저 awk줄 끝을 unix스타일로 변경하고, dos2unix사용 가능한 경우 또는 withperl

$ perl -i -pe 's|\r\n|\n|' ip.txt 
$ cat -e ip.txt 
    MT      200610-1        100     2757$
    MT      200610-10       100     6753 $
    MT      200610-100      100     15173$

그런 다음

$ awk -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt 
chrMT   2756    2757    200610-1
chrMT   6752    6753    200610-10
chrMT   15172   15173   200610-100

또는 를 사용하여 GNU awkdos 스타일 줄 끝을 처리하도록 입력 레코드를 설정합니다.

gawk -v RS='\r\n' -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt

답변2

명령문 의 모든 내용을 print원하는 형식으로 입력하고 필요한 작업(예: 뺄셈) $NF - 1도 수행합니다.

awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt

분명히 여기 $4대신 사용할 수 있지만 $NF네 번째 필드가 마지막 필드이므로 둘 다 동일한 필드를 가리킵니다.

예:

% awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt 
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100

관련 정보