各列/フィールドを出力したいのですが、変数を使用してこれを実行すると、$0
デフォルト変数は単一変数として無視されるため、印刷を続けます。OFS
space
:
私が試したコマンドは次のとおりです。
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
):
最後に、
awk
sumフィールドの現在の値を使用してレコード全体を強制的に書き換えるのが便利な場合があります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"};'