Adicionando sufixo diferente ao final da linha [duplicado]

0

Eu tenho um arquivo de texto que contém isso:

John
Jack
Jerry

Eu tenho outro arquivo de texto:

2017
2015
2018

E eu quero fazê-los assim:

John2017
John2015
John2018
Jack2017
Jack2015
Jack2018
Jerry2017
Jerry2015
Jerry2018

Como posso fazer isso?

    
por Cfem 11.02.2017 / 22:34

3 respostas

3

Supondo que os arquivos sejam pequenos, pode ser viável lê-los em matrizes (com bash ou ksh93 ):

names=( $( <names.txt ) )
years=( $( <years.txt ) )

Você pode então criar um loop duplo que combina cada nome com cada ano por vez:

for n in "${names[@]}"; do
  for y in "${years[@]}"; do
    printf '%s%s\n' "$n" "$y"
  done
done

Se years.txt for pequeno, mas names.txt for grande:

years=( $( <years.txt ) )

while read n; do
  for y in "${years[@]}"; do
    printf '%s%s\n' "$n" "$y"
  done
done <names.txt

Resultado:

John2017
John2015
John2018
Jack2017
Jack2015
Jack2018
Jerry2017
Jerry2015
Jerry2018

Como tratar os arquivos como arquivos CSV de coluna única, sem cabeçalho:

$ csvsql -H --query "SELECT * FROM names CROSS JOIN years" names.txt years.txt | sed -e '1d' -e 's/,//'

Isso realiza uma operação de cruzamento cruzado nos dados nas duas tabelas e, em seguida, continua para remover a primeira linha da saída junto com todas as vírgulas ( csvsql cria CSV formatado corretamente com uma linha de cabeçalho e valores separados por vírgulas).

csvsql faz parte de csvkit .

    
por 11.02.2017 / 23:18
1

A solução que @Kusalananda forneceu é superior a esta. Eu forneci sem pensar completamente em qual $(cat ...) faz em termos de uso de memória. Vou deixar aqui para referência - vai funcionar e não é terrível se os arquivos forem pequenos.

#!/bin/bash

for name in $(cat names); do
    for year in $(cat years); do
        echo "${name}${year}"
    done
done
    
por 11.02.2017 / 23:39
1
$ join -j2 -t : names year | tr -d :
  • junte-se por um campo não existente e remova os separadores de campo de saída.

O campo 2 está vazio e igual para todos os elementos em names e year então join irá concatenar cada nome com todos os anos: ele está, de fato, calculando o produto cartesiano.

    
por 12.02.2017 / 00:33