mesclar dois arquivos diferentes com diferentes linhas de linhas

2

Eu tenho dois arquivos enormes e o número de linhas em ambos os arquivos não é o mesmo.

arquivo1

61346877
41724134
85406965
59647779
25199749
86213
45417131
41905714
19415458
1828594
56543876
70603415

Arquivo2

212
1231
324234
213

Saída desejada

61346877,212
41724134,1231
85406965,324234
59647779,213
25199749,212
86213,1231
45417131,324234
41905714,213
19415458,212
1828594,1231
56543876,324234
70603415,213
    
por anurag 11.08.2015 / 18:44

3 respostas

4

bash:

size1=$( wc -l < file1 )
size2=$( wc -l < file2 )
i=0
while (( i < size1 )); do
    cat file2
    (( i += size2 ))
done | paste -d, file1 -  | head -n $size1

Eu canudo para head caso o tamanho do arquivo1 não seja um múltiplo do arquivo2

saída

61346877,212
41724134,1231
85406965,324234
59647779,213
25199749,212
86213,1231
45417131,324234
41905714,213
19415458,212
1828594,1231
56543876,324234
70603415,213

Um programa awk de 3 linhas

awk -v OFS=, '
    # read the smaller file into memory
    NR == FNR {size2++; file2[FNR] = $0; next} 

    # store the last line of the array as the zero-th element
    FNR == 1 && NR > 1 {file2[0] = file2[size2]} 

    # print the current line of file1 and the corresponding file2 line
    {print $0, file2[FNR % size2]}
' file2 file1
    
por 11.08.2015 / 19:14
2

O que você tem aí é o arquivo2 repetir uma vez que todas as linhas no arquivo2 tenham sido lidas. Aqui está uma solução awk / sed que toma o número de linhas no arquivo2 como variável e imprime linhas no arquivo2 de acordo com o contador, que está sendo redefinido sempre que ultrapassamos o número total de linhas no arquivo

$ awk -v file2lines=$(wc -l file2 | cut -f1 -d' ') 'BEGIN{count=1} {if(count > file2lines) count=1; printf $1",";system("sed -n -e "count"p file2");count++}' file1

61346877,212
41724134,1231
85406965,324234
59647779,213
25199749,212
86213,1231
45417131,324234
41905714,213
19415458,212
1828594,1231
56543876,324234
70603415,213
    
por 11.08.2015 / 23:26
2

Simples usando awk ;)

awk 'FNR==NR{a[i++]=$0; max=i; next} {if ((NR % max) == 0) {i=max-1} else {i=(NR%max) - 1}; printf "%s,%s\n",$0,a[i]}' file2 file1

Exemplo de saída

61346877,212
41724134,1231
85406965,324234
59647779,213
25199749,212
86213,1231
45417131,324234
41905714,213
19415458,212
1828594,1231
56543876,324234
70603415,213
    
por 12.08.2015 / 08:31