次のように、ファイルの1行を複数行に分割する簡単な方法があるかどうか疑問に思います。
私は持っています
A B C
1 2 3 4
私は行の最初の文字列に基づいて次のようなものを取得したいと思います。
A B
A C
1 2
1 3
1 4
デフォルトでは、行の最初の文字列に基づいて2番目、3番目、4番目の文字列で複数行を作成します。
答え1
スタート
awk '{for (i=2; i<=NF; ++i) print $1, $i}' file
A B
A C
1 2
1 3
1 4
答え2
printf %s\\n 'A B C' '1 2 3 4'|
sed -e's/\([^ ]*\) *[^ ]*/&\n\1/;//P;D'
A B
A C
1 2
1 3
1 4
これはうまくいきます。 1つ以上のスペースで区切られたゼロ以上のスペース以外の文字の最初の2つのシーケンスを選択します。最初のシーケンスはで参照され、\1
全体の選択はにあります&
。選択項目はそれ自体で置き換えられ、\n
その後にewlineが置き換えられます\1
。その後、パターンスペースは改行が最初に現れる位置に印刷され、同じ部分が削除され、パターンD
スペースは残りの部分と一緒にスクリプトの上にリサイクルされます。
ookコマンドを使用して、それが何をしているのかを確認できますl
。交換しP
て交換する前に他のものを入れてくださいl
...l
s///
A B C$
A B\nA C$
A C$
A C\nA$
A$
1 2 3 4$
1 2\n1 3 4$
1 3 4$
1 3\n1 4$
1 4$
1 4\n1$
1$
printf %s\\n 'A B C' '1 2 3 4'|
sed -ne:t -e'/ *[^ ]*/{s//\n&/2;P;s///;} -ett
A B
A C
1 2
1 3
1 4
少なくとも一連の空白文字と末尾の空白以外の文字を含むパターンスペースと一致します。最初の置換は、そのシーケンスが2番目に発生する前に改行を挿入してから改行としてP
印刷し、2番目はパターンの最初の発生を削除します。これで、シーケンスの最後に追加された最初の改行も含まれます。文字が動作する順序第二に。 estは置換が発生するたびにラベルに分岐するため、スペースで区切られたフィールドはt
一度に1つずつパターン空間を占有します。:t
sed
確認をもう一度使用してくださいl
。
A B C$
A B\n C$
A C$
A C$
1 2 3 4$
1 2\n 3 4$
1 3 4$
1 3\n 4$
1 4$
1 4$
答え3
バッシュを使う -
while read x ; do set $x ; first=$1 ; shift; for i in $* ; do echo $first $1; shift; done ; done < /tmp/1
A B
A C
1 2
1 3
1 4