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
Eu tenho dois arquivos:
a.txt
1
2
3
b.txt
foo
bar
baz
qux
Executando paste a.txt b.txt
dá
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?
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
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
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
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
Tags command-line paste