2017-12-06 20 views
-1

14個の列を持つ.txtファイルがあります。その頭は次のようになります:awkコードの説明:フィールドの順序の変更

name A1 A2 Freq MAF Quality Rsq n Mean Beta sBeta CHi rsid 
SNP1 A T 0.05 1  5 56 7 8 9 11 12 rs1 
SNP2 T A 0.05 1  6 55 7 8 9 11 12 rs2 

最後の列を最初の位置に配置します。私はこれを行うための最も効率的な方法は何であったかわからなかったが、私は他の記事から自分自身を鼓舞、この出くわした:私は私が考えるこれはこれを、得られ

awk '{$0=$NF FS$0; $14=""}1' file.txt | head 

作品:

rsid name A1 A2 Freq MAF Quality Rsq n Mean Beta sBeta CHi 
rs1  SNP1 A T 0.05 1  5 56 7 8 9 11 12 
rs2  SNP2 T A 0.05 1  6 55 7 8 9 11 12 

私はコードが正確に何を理解するのにも苦労しています。

  • 私はFSが、どのように私のコードの作業が正確にでき、フィールドの区切り文字

であることを知ってNFが

  • ラインのフィールドカウント処理されていることを知っていますか?私は実際に$ 0(全体の行)がNFと等しく、FS $ 0(これが何を意味するかわからない)が最後のフィールドが最初に終わると言っているかどうかは分かりません。私は$ 14 = ""が書かれていないことを認識しています。あなたは2つのrsid列で始まり、最初は1つ、最後は1つです。

    私はawkを使いこなすのがとても簡単です。これを達成するためのより簡単な方法があれば、私はうれしくそれに行きます。

    ありがとうございました

  • 答えて

    0

    これが同じことをお手伝いしてくれたら教えてください。

    awk '{ 
    $0=$NF FS$0; ##Re-creating current line by mentioning $NF(last field value), FS(field separator, whose default value is space) then current line value. 
    $14=""   ##Now in current line(which is edited above by having last field value to very first) nullifying the last(14th field) here, you could use $NF here too(in case your Input_file have only 14 fields. 
    } 
    1    ##1 means we are making condition TRUE here and not mentioning any action so by default print action will happen. 
    ' file.txt  ##Mentioning Input_file name here. 
    
    +0

    $ 0 = $ NF FS $ 0は、「最後のフィールドを$ 0(行全体)にしてから、$ 0にフィールド区切り文字を使用しますか? 。申し訳ありませんが、それはちょうど非常に本能的ではないようです。私は理解していると思うが、私は – m93

    +0

    が割り当てとして等号を読むのか分からない。 '$ 0'を最後のフィールド+フィールドセパレータ+古いラインとして設定します。これは、ほとんどの(すべての)プログラミング言語で同じ概念です。 – karakfa

    +0

    ああ、私ははいを参照してください。私はFS $ 0で混乱していると思う。 $ 0 = $ NF FS $ 0と書くと、私の端末で見ることができます。どうもありがとうございます! – m93

    2

    sed

    sed -E 's/(.*)\s(\S+)$/\2 \1/' file 
    

    それは順序を逆に印刷し、最後のフィールドと行の残りの部分と一致すると簡単になります。

    \sは、空白文字の略で、[ \t\r\n\f]に相当します。 \Sは、空白以外の場合、\sの否定です。 \sのPOSIXに相当するものは[:space:]です。 sedが簡略表記をサポートしていない場合、または完全な移植性を望む場合は、同等の形式のいずれかを使用する必要があります。

    +0

    GNU sedは '\ s'と' \ S'に対してのみ言及する必要があります。 –

    関連する問題