web-dev-qa-db-ja.com

cutコマンドからの出力フィールドの順序を強制する

私はこのようなことをしたい:

cat abcd.txt | cut -f 2,1 

そして、出力の順序を2、次に1にします。私がテストしているマシン(FreeBSD 6)では、これは発生していません(1,2の順序で印刷されます)。これを行う方法を教えてもらえますか?

私はいつでもこの逆転を行うためのシェルスクリプトを書くことができることを知っていますが、私は「カット」コマンドオプションを使用して何かを探しています。

私はcutを含むcoreutilsのバージョン5.2.1を使用していると思います。

34
Shreeni

これは、cutを使用して実行することはできません。マニュアルページによると:

選択された入力は、読み取られるのと同じ順序で書き込まれ、1回だけ書き込まれます。

パッチ適用cut提案多く ですが、 完全なパッチは拒否されました です。

代わりに、次のようにawkを使用して実行できます。

awk '{print($2,"\t",$1)}' abcd.txt

\tをフィールド区切り文字として使用しているものに置き換えます。

35
Lars Haugseth

ラースの答えは素晴らしかったが、私はさらに良いものを見つけた。彼の問題は、列がないため\ t\tと一致することです。これを修正するには、以下を使用します。

awk -v OFS="  " -F"\t" '{print $2, $1}' abcd.txt

どこ:

-F"\t"は何をカットするかです正確に(タブ)。

-v OFS=" "は何で区切るか(2つのスペース)

例:

echo 'A\tB\t\tD' | awk -v OFS="    " -F"\t" '{print $2, $4, $1, $3}'

この出力:

B    D    A    
17
Evan Moran