Como concatenar três arquivos (e pular a primeira linha de um arquivo) e enviá-los como entradas para o meu programa?

4

Existem os arquivos A, B e C. Eu quero concatenar o arquivo A, B e C (pule a primeira linha de C). E depois enviá-los para myProgram como entrada. Como posso escrever isso no script de shell?

Eu escrevi isso

cat A > file
echo >> file     //want to start all contents in new line
cat B >> file
tail -n+2 C >> file
./myProgram < file 

Mas não tenho ideia de como concatená-los e enviar para um programa sem gerar um arquivo

    
por John 19.10.2016 / 20:50

6 respostas

12

Tente isto:

{ cat A ; echo; cat B ; awk 'NR>1' C ; } | programm

comandos de colocação dentro de chaves são agrupamento .

Não que o ; seja obrigatório se não houver uma nova linha para finalizar o agrupamento .

E não precisa de um outro subshell aqui;)

    
por 19.10.2016 / 21:18
6

Usando a substituição de processos

./myProgram < <(cat A; echo ''; cat B; tail -n +2 C)

<(commands) cria um arquivo fifo que é então lido no programa

Você pode testar fazendo

$ echo <(cat A; echo ''; cat B; tail -n +2 C) /dev/fd/63

Process Substitution is supported on systems that support named pipes (FIFOs) or the /dev/fd method of naming open files. It takes the form of <(list) or >(list). The process list is run with its input or out- put connected to a FIFO or some file in /dev/fd. The name of this file is passed as an argument to the current command as the result of the expansion. If the >(list) form is used, writing to the file will pro- vide input for list. If the <(list) form is used, the file passed as an argument should be read to obtain the output of list. When available, process substitution is performed simultaneously with parameter and variable expansion, command substitution, and arithmetic expansion.

    
por 20.10.2016 / 01:11
5

Use um subshell. Execute os comandos em um subshell e canalize a saída para o seu programa.

(cat a; echo; cat b; tail -n+2 c) | ./myProgram
    
por 19.10.2016 / 21:18
4
tail -n +2 C | cat A <(echo) B - | myProgram

Aqui, você diz tail para ler da linha 2 em diante e passá-lo para cat , que concatenará em ordem A + B + STDIN (-) e passará para myProgram.

Editar: Adicionado a nova linha entre A e B.

    
por 19.10.2016 / 21:17
3

abordagem awk

awk 'ARGIND<3;ARGIND==3&&FNR>1' a b c | ./myProgram
    
por 19.10.2016 / 23:39
2

Mais algumas possibilidades:

{ grep -h "^" A B ; { read; cat; } < C ; } | ./myProgram
  • grep "^" corresponde ao início da linha every , mesmo que a última linha não termine em uma nova linha. -h impede o grep de prefixar cada correspondência com o nome do arquivo.
  • read lê (e descarta) a primeira linha de C, então o cat fornece o resto de C.

Ou apenas com sed :

{ sed "" A B ; sed "1d" < C ; } | ./myProgram
    
por 20.10.2016 / 00:58