各行に異なるプレフィックスを追加するにはどうすればよいですか?

各行に異なるプレフィックスを追加するにはどうすればよいですか?

リスト/テキストファイル(ファイル)にファイルがあります。テスト.txt)。

たとえば、

smith
johnson
west

各文字を各行の接頭辞として追加して新しいテキストファイルに出力するにはどうすればよいですか?

希望の出力:

asmith
bsmith
csmith
dsmith
...
ajohnson
bjohnson
cjohnson
etc., etc.

答え1

使用awk:

awk '{ for (asc=97; asc<=122; asc++)printf ("%c%s\n", asc, $0) }' infile

私たちはprintfとその%c(文字変換修飾子を使用しました。人間のawk(詳細はこちら) ASCII 小文字の英字を印刷します。 ASCIIコード:97(文字a)で始まり、ASCIIコード:122(文字z)で終わり、その後に現在の行自体が続きます。ASCIIテーブル参照

答え2

次のようなトリックを行います。

while IFS= read -r i; do
  for j in {a..z}; do
    echo "${j}${i}"
  done
done < input_file > new_text_file
# use `>> new_text_file` to append instead of overwrite

ループはwhileファイルから名前を読み取り、forループはaからzまでの文字を生成します。このechoコマンドは、aからzまでの文字をファイルから読み取った名前に関連付けます。

答え3

join存在しない列を結合してクロス結合を作成するには、このユーティリティを使用します。

join -1 2 -2 2 -o 2.1,1.1 file <( printf '%s\n' {a..z} ) | sed 's/\(.\) /\1/'

または手続き型置換なしで:

printf '%s\n' {a..z} | join -1 2 -2 2 -o 2.1,1.1 file - | sed 's/\(.\) /\1/'

最後に、sed2つの出力列間のスペースを削除しますjoin

このコマンドは、joinサブスクリプションを指定するオプションを使用します。第二各ファイルの列(-1 2合計)です-2 2。列が存在しないため、「all-vers-all」効果が得られます。この-oオプションとそのオプション引数は出力形式を指定します。最初のファイルのデータよりも2番目のファイルのデータを取得します-o 2.1,1.1(「2番目のファイルの最初の列、次に最初のファイルの最初の列」)。

出力は次のとおりです

asmith
bsmith
csmith
dsmith
esmith
fsmith

etc.

答え4

申請可能Brace Expansion

eval printf "'%s\n'" "{a..z}{$(paste -sd, file)}"

evalコマンドを実行した後、次のような結果が得られます。

printf '%s\n' {a..z}{smith,johnson,west}

修正する:

eval printf "'%s\n'" "{$(paste -sd, file)}\ {a..z}" | column -to '' -O2

-O2- 首都o。列の出力順序です。 2番目の列から始めてください。

関連情報