파일을 사용하려고 합니다...
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
가능한 경우 사용하거나 사용하세요.perl
$ 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