이 파일을 사용하려고 합니다...
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 awk
dos 스타일 줄 끝을 처리하도록 입력 레코드를 설정합니다.
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