次のようなファイルがあるとしましょう。
A 1
B 2
CC 33
次のように、古いファイルの両方の組み合わせを含むファイルを作成したいと思います。
AA 11
AB 12
ACC 133
BA 21
BB 22
BCC 233
CCA 331
CCB 332
CCCC 3333
任意のファイルに対してbashを使用してこれを実行できますか?各項目には、改行とスペースを除く任意の文字を含めることができます。一部の項目にはUTF-8文字が含まれています。
私は順序に興味がありません。
ベストアンサー1
これはすべてシェルで実行できます。
while read -r f1 f2
do
while read -r f3 f4
do
printf "%s %s\n" "$f1$f3" "$f2$f4"
done < your_file
done < your_file
IFS=" " read
「各項目には、改行やスペースを除くすべての文字を含めることができます。」項目にタブ文字を含めることができることを意味する場合は、代わりにread
(2回)と言ってください。
「詳細」:
このようなコマンドは、read f1 f2
入力行の最初の「単語」を変数としてf1
読み込み、残りの行入力するf2
。たとえば、入力は sum をThe quick brown fox
生成します。ファイルに3つ(またはそれ以上)の列が含まれないと確信している場合(つまり、1行に2つ以上の単語が含まれていない)、心配する必要はありません。最初の単語の一部ではないすべての項目が2番目の単語の一部と見なされることに満足している場合、上記のコードは問題ありません。 f1="The"
f2="quick brown fox"
The quick brown fox
ただし、処理しf1="The"
てf2="quick"
無視brown fox
(無視)するには、read
各コマンドに3番目の変数を追加します。例えば;f1 f2
になります。すると、f1 f2 x
となります。ただ使用しないで、2番目の単語の後の入力を削除します。 2回目も同様 - 使わないので上書きしても構いません。たとえば、別のワンタイム変数を使用したい場合にも可能です。f1="The"
f2="quick"
x="brown fox"
$x
read
read -r f3 f4 x
$x
… f3 f4 y
デフォルトでは、このread
コマンドはバックスラッシュ(\
)文字を特別に処理します。デフォルトでは、バックスラッシュの後に他の文字が続く場合は、2番目の文字の特殊バージョンにマージされます。しかし、もっと重要なのは、バックスラッシュの後にスペースが続くのは単語区切り文字とは見なされず、バックスラッシュの後の改行(つまり行末のバックスラッシュ)は行区切り記号/終了記号とは見なされないことです\C\C
。CC
。read
このオプションを呼び出すと、-r
オプションが停止し、バックスラッシュがプレーン文字になります。以下は、違いのいくつかの実際的な例です。
-rなし(デフォルト)__ -r有効__ _入力_ f1 f2 f1 f2 A\B\\C AB\CA\B\\C D\EFDEFD\EF (またはf2 = "E"とx = "F") G\ (一行ではカウントされません。) G\ GH GH
だから答えの最初のバージョンにマークアップを追加しました-r
。一言で処理したい場合はD\ E
使用しないでください-r
。