Como fazer o comando 'colar' parar no arquivo mais curto

3

Eu tenho dois arquivos:

a.txt

1
2
3

b.txt

foo
bar
baz
qux

Executando paste a.txt b.txt

1 foo 
2 bar 
3 baz 
 qux 

No entanto, eu quero parar quando o arquivo mais curto terminar (ou seja, quero imprimir apenas linhas completas, caso contrário, um programa posterior no pipeline vai pensar qux é o primeiro campo e o segundo está vazio, quando realmente é o único caminho de volta). Como posso fazer isso?

    
por user1350864 06.01.2018 / 18:13

4 respostas

2

Usar o comando sed pode excluir a linha sem um número inicial:

paste  a.txt b.txt | sed '/^\s/d'

Resultado:

1       foo
2       bar
3       bax
    
por 06.01.2018 / 18:52
2

Mesma ideia que as outras respostas - cole todas as linhas e selecione linhas completas - mas com awk :

paste a.txt b.txt | awk NF==2
    
por 06.01.2018 / 19:18
0

Contar linhas e head dos arquivos?

Precisa de um shell com substituição de processo ( <(…) ) (usando bash):

$ a=$(wc -l <a.txt)
$ b=$(wc -l <b.txt)
$ if [ "$a" -lt "$b" ]; then min=$a; else min=$b; fi
$ paste <( head '-'"$min" <a.txt ) <(head '-'"$min" <b.txt)
1       foo
2       bar
3       bax
    
por 06.01.2018 / 23:44
0

Como paste não tem nenhuma opção embutida para ignorar se linhas de arquivos não são iguais e como as soluções restantes são frágeis se seus arquivos contiverem mais de um campo, eu proporia usar awk:

$ cat file1
line 1
line 2
line 3

$ cat file2
foo line 1
foo line 2
foo line 3
foo line 4

$ awk 'NR==FNR{a[FNR]=$0;maxfnr=FNR;next}FNR<=maxfnr{print a[FNR],$0}'  file1 file2
line 1 foo line 1
line 2 foo line 2
line 3 foo line 3

A mesma solução do awk funcionará mesmo que o arquivo2 seja menor que o arquivo1, portanto, essa parece ser uma solução global não afetada pelo número de campos em cada arquivo nem pelo arquivo mais curto:

$ cat file1
line 1
line 2
line 3

$ cat file2
foo line 1
foo line 2

$ awk 'NR==FNR{a[FNR]=$0;maxfnr=FNR;next}FNR<=maxfnr{print a[FNR],$0}'  file1 file2
line 1 foo line 1
line 2 foo line 2
    
por 07.01.2018 / 01:03