awk - $0を印刷し、OFSを無視します。

awk - $0を印刷し、OFSを無視します。

各列/フィールドを出力したいのですが、変数を使用してこれを実行すると、$0デフォルト変数は単一変数として無視されるため、印刷を続けます。OFSspace:

私が試したコマンドは次のとおりです。

cat /etc/passwd | awk -F':' '{print $0}'

次の入力例を考えると、次のようになります。

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

コマンドから次の出力を取得します。

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

しかし、私は私の出力が次のようになりたいと思います。

root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologin

あなたの助けをいただきありがとうございます:)

答え1

$0入力フィールド区切り文字を含む行全体を表します。

フィールドを設定し、出力フィールド区切り文字を使用して分割して再結合できます。

</etc/passwd  awk -F: '{$1=$1;print}'

(拷問の代わりにファイルから直接読みましたcat;-)

この内容は次のように記録されます。フィールド内容の変更GNU実装マニュアルセクションawk(別名gawk):

最後に、awksumフィールドの現在の値を使用してレコード全体を強制的に書き換えるのが便利な場合がありますOFS。これを行うには、一見無害に見える割り当てを使用します。

$1 = $1   # force record to be reconstituted
print $0  # or whatever else with $0

これによりawk記録が再構成された。ここに示すようにコメントを追加すると、本当に役に立ちます。

答え2

$ 0フィールドは行にすぎず、解析されません。 NF変数(FSで決定されたフィールド数)を使用して各フィールドを繰り返す必要があります。

cat /etc/passwd | awk -F':' '{for (i=1;i<=NF;i++) {printf "%s ",$i}; printf "\n"};'

関連情報