次の内容を含むテキストファイルがあります。
John
Jack
Jerry
別のテキストファイルがあります。
2017
2015
2018
私は彼らが次のように見えることを望みます:
John2017
John2015
John2018
Jack2017
Jack2015
Jack2018
Jerry2017
Jerry2015
Jerry2018
どうすればいいですか?
答え1
ファイルが小さいと仮定すると(bash
または使用ksh93
)、配列に読み込むことが可能です。
names=( $( <names.txt ) )
years=( $( <years.txt ) )
その後、各名前を各年と順番に組み合わせる二重ループを構成できます。
for n in "${names[@]}"; do
for y in "${years[@]}"; do
printf '%s%s\n' "$n" "$y"
done
done
years.txt
小さいが大きい場合names.txt
:
years=( $( <years.txt ) )
while read n; do
for y in "${years[@]}"; do
printf '%s%s\n' "$n" "$y"
done
done <names.txt
結果:
John2017
John2015
John2018
Jack2017
Jack2015
Jack2018
Jerry2017
Jerry2015
Jerry2018
ファイルを単一列のヘッダーなしのCSVファイルとして扱います。
$ csvsql -H --query "SELECT * FROM names CROSS JOIN years" names.txt years.txt | sed -e '1d' -e 's/,//'
これは関係を実装します。クロスコネクト両方のテーブルのデータに対して操作を実行し、すべてのコンマとともに出力の最初の行を削除します(csvsql
ヘッダー行とコンマで区切られた値を持つ正しい形式のCSVを生成します)。
csvsql
の一部です csvkit
。
答え2
$ join -j2 -t : names year | tr -d :
- 存在しないフィールドを連結し、出力フィールド区切り文字を削除します。
names
フィールド2は空で、その中のすべての要素と同じであるyear
ためjoin
、各名前はすべての年に関連付けられます。実際にデカルト積を計算します。
答え3
@Kusalanandaが提供するソリューションはこのソリューションよりも優れています。$(cat ...)
メモリ使用量への影響を適切に考慮せずに提供しました。参考用としてここに残しておきます。動作し、ファイルが小さくても悪くはありません。
#!/bin/bash
for name in $(cat names); do
for year in $(cat years); do
echo "${name}${year}"
done
done