줄 끝에 다른 접미사 추가

줄 끝에 다른 접미사 추가

다음 내용이 포함된 텍스트 파일이 있습니다.

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

관련 정보