다음 내용이 포함된 텍스트 파일이 있습니다.
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