行の末尾に別のサフィックスを追加する

行の末尾に別のサフィックスを追加する

次の内容を含むテキストファイルがあります。

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

関連情報