Como anexar dados de vários arquivos em um único arquivo?

6

Por exemplo: Eu tenho arquivos 01.txt e 02.txt e preciso anexar dados desses arquivos no novo arquivo new.txt .

Ele deve anexar dados com base em 01.txt seguido por 02.txt arquivos.

Antes disso, preciso excluir apenas a primeira e última linha dos arquivos ( 01.txt 02.txt ) e, em seguida, anexá-los ao novo arquivo.

Como fazemos isso usando o UNIX?

    
por UNIXbest 09.08.2013 / 14:09

6 respostas

6

Outra abordagem:

for file in 01.txt 02.txt; do sed '1d;$d;' "$f"; done > output

Isso é particularmente útil quando há muitos arquivos que você precisa concatenar:

for file in *.txt; do ...

Você também pode usar a expansão de shell:

for file in 0{1,2}.txt; do ...
    
por 09.08.2013 / 16:21
4

Você pode excluir a primeira e a última linha com sed:

sed -e '1d' -e '$d' file1 > output
sed -e '1d' -e '$d' file2 >> output
sed -e '1d' -e '$d' file3 >> output
    
por 09.08.2013 / 14:34
4

Uma maneira fácil de imprimir tudo, exceto a primeira linha de um arquivo, é tail :

tail -n +2 01.txt

Para imprimir todas as linhas, exceto a última, de um arquivo, use head :

head -n -1 01.txt

Portanto, para juntar tudo isso e imprimir todas as linhas, exceto a primeira e a última, de 01.txt e 02.txt e salvá-las como 03.txt , você pode usar um subshell para combinar a saída dos comandos acima nos dois arquivos:

(tail -n +2 01.txt | head -n -1; tail -n +2 02.txt | head -n -1) > new.txt
    
por 09.08.2013 / 14:30
1

Com um loop for, cabeça e cauda:

for f in 01.txt 02.txt; do head -n-1 $f | tail -n+2; done > newfile.txt

Com python:

python -c 'print("\n".join(["\n".join(open(f).read()[:-1].split("\n")[1:-1]) for f in ("01.txt", "02.txt")]))' > newfile.txt

Ou com o awk:

awk 'FNR > 1 { lines[FILENAME][FNR] = $0; lines[FILENAME][0] = FNR } END { for (i=1; i < ARGC; i++) { for (i2=2; i2 < lines[ARGV[i]][0]; i2++) { print lines[ARGV[i]][i2]; } } }' 01.txt 02.txt > newfile.txt
    
por 10.08.2013 / 01:13
0

Com o GNU sed :

sed -s '1d;$d' ./*.txt > output

Nota: você quer ter certeza de que o nome do arquivo de saída não corresponde ao padrão de globbing ( *.txt acima). Caso contrário, você teria que escrevê-lo assim:

sed -sn '1d;$d;w output.txt' ./*.txt

(assumindo que output.txt não existia de antemão).

    
por 10.08.2013 / 10:15
-2
sed \$r01.txt new.txt
sed \$r02.txt new.txt
    
por 18.12.2014 / 12:54