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

最後に2番目の列を追加しようとすると、奇妙なことが起こります。

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 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明らかにここでは代わりに使用できますが、$NF4番目のフィールドは最後のフィールドなので、両方とも同じフィールドを指します。

例:

% 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

関連情報