csv行の各文字列を分離したいと思います。
線の例(他の線、同じ概念である可能性があります)
machine23,machine094,machine73,machine83
それではこれを試してみましょう
echo machine23,machine094,machine73,machine83 |awk -F"," '{for(i=1;i<=NF;i++){printf "%-20s", $i};printf "\n"}'
しかし、我々は得る
machine23 machine094 machine7 machine83
代わりに、次のような予想結果を取得します。
machine23
machine094
machine7
machine83
どんな提案がありますか?
答え1
$ echo machine23,machine094,machine73,machine83 | tr ',' '\n'
machine23
machine094
machine73
machine83
または、実際にこれをawkで実行したい場合(おそらくawkでさらに処理したいからです):
$ echo machine23,machine094,machine73,machine83 | \
awk -F',' -v OFS='\n' '{$1=$1;$0=$0;print}'
machine23
machine094
machine73
machine83
これはきちんとしたawkトリックを使用します。フィールドを変更した後( のようにフィールドがそれと同じに設定されている場合でも$1=$
) set すると、$0=$0
awk は入力行全体の書式を再指定します。元のフィールド区切り文字(FS
この場合はカンマ)を次のように置き換えます。出力フィールド区切り記号(OFS
この場合は改行文字)。
答え2
まず、教育の精神として、以下は、独自のロジックをあらかじめ用意されたバージョンにまとめたものです(読みやすくするために梱包して間隔をあけています)。
$ echo machine23,machine094,machine73,machine83 \
|awk -F"," '{ for (i = 1; i <= NF; i++) { printf "%-20s\n", $i } }'
machine23
machine094
machine73
machine83
使用してから末尾の空白が追加されますが%-20s
(上記の出力を選択して確認)、私がしたことはprintf "\n"
ループ内に移動しただけです。printf
for
あなたのバージョンには空白がほとんどないので、ここに暗号通貨ゴルフ論理ソリューションを使用してください。
echo machine23,machine094,machine73,machine83|awk -F, '{while(i<NF)print$++i}'
以下は、ループなしでグローバル置換を使用するフィールドに依存しないawkソリューションです。
$ echo machine23,machine094,machine73,machine83 |awk '{ gsub(/,/,"\n"); print }'
machine23
machine094
machine73
machine83
これは次のsedソリューションを模倣します。
$ echo machine23,machine094,machine73,machine83 |sed 's/,/\n/g'
machine23
machine094
machine73
machine83
上記の両方ともコンマを改行に置き換えます。CASのtrソリューション。
grepソリューションは次のとおりです。
$ echo machine23,machine094,machine73,machine83 |grep -o '[^,]*'
machine23
machine094
machine73
machine83
これにより、grep show only(-o
)がコンマではなくテキストと一致し、各項目が1行に表示されます。