使用 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

如果我只做前三個這樣它就可以了..

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

相關內容