現在の形式のテーブルがあります。
Lead:Arrow1:Arrow2:Arrow3
Follow:Arrow4:Arrow5:Arrow6:Arrow7:Arrow8:Arrow9
これに移動したい
Lead
Arrow1
Arrow2
Arrow3
Follow
Arrow4
Arrow5
Arrow6
Arrow7
Arrow8
Arrow9
私は試しましたawk
:
$(awk -F":" '/Lead/ {print NF-1}' $f)
$(awk -F":" '/Follow/ {print NF-1}' $f)
しかし、成功しませんでした。この方法awk
や他の方法はどうすればよいですか?
答え1
tr
次のように使用できます。
<file tr ":" "\n"
Lead
Arrow1
Arrow2
Arrow3
Follow
Arrow4
Arrow5
Arrow6
Arrow7
Arrow8
Arrow9
またはawk
次のようになります。
<file awk '{gsub(/:/,"\n")}1'
Lead
Arrow1
Arrow2
Arrow3
Follow
Arrow4
Arrow5
Arrow6
Arrow7
Arrow8
Arrow9
答え2
提案どおりに使用してくださいawk
。
$ awk '{ gsub(":", "\n", $0); print }' <file
Lead
Arrow1
Arrow2
Arrow3
Follow
Arrow4
Arrow5
Arrow6
Arrow7
Arrow8
Arrow9
これは、:
入力データのすべての内容を改行文字に置き換えます。
awk
(出力フィールド区切り文字)変数を使用する別のOFS
解決策:
awk -v OFS='\n' -F ':' '{ $1=$1; print }' <file
割り当ては$1=$1
偽に見えますが、現在の入力レコードは(andawk
に従って再フォーマットされますが、デフォルトの改行は変更されません)、これはすべての区切りフィールド間に改行文字を挿入することを意味します。OFS
ORS
:
を使用すると、別々のフィールドを繰り返して個別に印刷することもawk
できます。:
awk -F ':' '{ for (i = 1; i <= NF; ++i) print $i }' <file
答え3
もう一つの非常に簡単な解決策は、sedを使用してsを空白に変換し、ループから:
単語を印刷することです。echo
for
for i in $(sed 's/:/ /g')
do
echo $i
done
スクリプトは標準入力から標準出力に読み込まれます。