Ordenação de duas listas separadas por espaços lado-a-lado [duplicado]

0

Eu fiz dois arquivos, foo.txt e bar.txt

foo.txt parece assim: foo1 foo2 foo3 foo4 foo5 foo6 foo7 foo8 foo9 foo10

e bar.txt: bar1 bar2 bar3 bar4 bar5 bar6 bar7 bar8 bar9 bar10

Como você obtém esses dois arquivos de texto e os envia para um arquivo de texto chamado foobar.txt, ordenando-os como

foo1 bar1
foo2 bar2
foo3 bar3
...

Coisas do administrador: estou recebendo avisos sobre essa pergunta ser duplicada porque as pessoas sugeriram combinar

foo1
foo2
foo3
foo4
foo5 

e

bar1
bar2
bar3
bar4
bar5

É o mesmo processo. Se você tiver que fazer isso, em vez disso, você pode encontrar o texto de endereçamento de pergunta na nova combinação de linhas aqui: Link para a pergunta de user2120893

Para endereçar arquivos de edição, com um comando, de itens espaçados, você precisa usar a resposta que eu marquei abaixo usando o awk. Continuei vendo questões de 'como combinar duas listas' e 'como separar listas espaçadas em novas listas de linhas' mas nunca um comando de uma linha, usando o awk, para separar duas listas espaçadas por funções do awk e combiná-las por meio do awk . Um grande obrigado a Sergiy Kolodyazhnyy por finalmente responder minha pergunta (e usar apenas um comando para fazer isso!). Eu tenho procurado uma resposta para isso por um tempo e um assistente de awk interveio para nos mostrar as cordas. Agradecemos a John1024 por outra ótima resposta.

    
por CubeSyVal 21.03.2018 / 06:39

4 respostas

0

Decentemente possível com awk :

$ awk 'NR==FNR{split($0,a);}NR!=FNR{for(i=1;i<=NF;i++) print a[i],$i}' foo.txt bar.txt
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
foo6 bar6
foo7 bar7
foo8 bar8
foo9 bar9
foo10 bar10
    
por 21.03.2018 / 07:04
1

Vamos começar com esses dois arquivos:

$ cat foo.txt 
foo1 foo2 foo3 foo4 foo5 foo6 foo7 foo8 foo9 foo10
$ cat bar.txt 
bar1 bar2 bar3 bar4 bar5 bar6 bar7 bar8 bar9 bar10

Para combiná-los juntos:

$ paste <(tr ' ' '\n' <foo.txt) <(tr ' ' '\n' <bar.txt)
foo1    bar1
foo2    bar2
foo3    bar3
foo4    bar4
foo5    bar5
foo6    bar6
foo7    bar7
foo8    bar8
foo9    bar9
foo10   bar10

Ou:

$ awk -v RS='[[:space:]]+' 'FNR==NR{a[NR]=$0; next} {print a[FNR],$0}' foo.txt bar.txt
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
foo6 bar6
foo7 bar7
foo8 bar8
foo9 bar9
foo10 bar10
    
por 21.03.2018 / 06:53
1

Aproveitando a resposta de Hillsie para essa pergunta semelhante , se você estiver usando o bash, você pode fazer

paste <(tr ' ' '\n' < foo.txt) <(tr ' ' '\n' < bar.txt)

usando a substituição de processos ( <(…) ) para traduzir os espaços em seus arquivos para novas linhas.

    
por 21.03.2018 / 06:57
1

Como uma alternativa às abordagens de transposição e combinação já postadas, aqui está uma abordagem de combinar e transpor:

$ cat foo.txt bar.txt | rs -T
foo1   bar1
foo2   bar2
foo3   bar3
foo4   bar4
foo5   bar5
foo6   bar6
foo7   bar7
foo8   bar8
foo9   bar9
foo10  bar10
    
por 21.03.2018 / 07:01