最初の文字列に基づいて行をキーと値のペアに分割

最初の文字列に基づいて行をキーと値のペアに分割

次のように、ファイルの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...ls///


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つずつパターン空間を占有します。:tsed

確認をもう一度使用してください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

関連情報