リスト/テキストファイル(ファイル)にファイルがあります。テスト.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/'
最後に、sed
2つの出力列間のスペースを削除します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番目の列から始めてください。