Dividir o conteúdo de um arquivo no linux

5

Eu tenho um arquivo de texto com conteúdo como este:

abc.tar^@xxx.tar^@yyy.tar^@ 

Por exemplo, eu tenho esse conteúdo em um arquivo chamado abc.txt e quero dividir o conteúdo e gravar as duas primeiras entradas em um novo arquivo.

(por exemplo), o novo arquivo ficaria assim:

abc.tar^@xxx.tar^@

Existe algum comando para executar esta operação?

    
por Mano 05.08.2013 / 17:38

5 respostas

0

Suponho que esta questão está relacionada com aquele , correto?

Nesse caso, não substituir o '^ @' por uma nova linha valeria mais a pena? No seguinte, eu estou supondo que você quer dizer '^ @', o byte ASCII NUL:

$ sed 's/\o000/\n/g' abc.txt | head -n 2
abc.tar
xxx.tar

Então você precisa

sed 's/\o000/\n/g' abc.txt | head -n 2 > newfile.txt

Explicação

Isso substitui uma nova linha ( \n ) por cada byte NUL ( \o000 ), a parte \o significa que o que segue é um byte em notação octal. A saída é então canalizada para head -n 2 , que extrai as duas primeiras linhas; e as linhas resultantes são redirecionadas ( > ) para o arquivo newfile.txt .

Se for importante para você que os nomes dos arquivos sejam separados por '^ @', você pode usar isto:

perl -nl000 -e '
    $num_lines =2 ;
    push @a,(split /
$ sed 's/\o000/\n/g' abc.txt | head -n 2
abc.tar
xxx.tar
0/)[0..$num_lines-1]; print $_ for @a' abc.txt > newfile.txt

Substitua o valor de $num_lines acima, conforme necessário, para obter as primeiras linhas $num_lines do arquivo.

Explicação

  • A opção -n informa perl para executar o código em cada linha do arquivo de entrada
  • A sequência -l000 informa perl para definir o separador de registro de saída (o caractere impresso após cada string) para o byte NUL ( 000 ).
  • A opção -e informa perl que a sequência que segue é um código a ser executado.
  • A função split divide cada linha de entrada com o byte NUL como delimitador, obtém os primeiros resultados $num_lines ( [0..$num_lines-1] ) e os coloca no array @a . Observe que a parte da "linha de entrada atual" não é especificada em nenhuma parte da chamada de função. Isso faz uso do fato de que a variável escalar padrão em Perl ( $_ ) é o argumento padrão da função split (entre outros) quando nenhum argumento é fornecido.
  • O loop final foreach imprime todos os elementos em @a (observe novamente como $_ é o iterador padrão para o loop foreach ). Como definimos o separador de registro de saída como octal 000 , obtemos os resultados separados pelo byte NUL como antes.
por 05.08.2013 / 18:54
3

Isso é:

awk -F"@" '{print $1"@"$2"@"}' abc.txt > newfile.txt

bom o suficiente para você?

    
por 05.08.2013 / 17:45
1

Tente executar:

sed -r -i 's/^(.*)@.*@.*$//' file
    
por 05.08.2013 / 17:49
0

Veja um exemplo usando o Perl:

$ perl -ne '@F = split(/@/,$_); print "$F[1]\@$F[2]@";' abc.txt > newfile.txt

O texto acima faz o seguinte:

  • @F = split(/@/,$_) - divide o conteúdo do arquivo abc.txt uma linha por vez com base no caractere @ e armazena os fragmentos resultantes em uma matriz ( @F ).
  • print "$F[1]\@$F[2]@" - imprime as duas primeiras colunas, (1 & 2), da matriz @F e insere um sinal de arroba ( @ ) entre cada coluna.
por 05.08.2013 / 19:10
0

O awk pode usar qualquer caractere como separador de registro (com a nova linha como padrão), exceto que algumas implementações não suportam o byte nulo como separador. Gawk (GNU awk), o padrão awk na maioria das instalações Linux não embarcadas, suporta nulos.

gawk -v RS='
gawk -v RS='
tr '
gawk -v RS='
gawk -v RS='
tr '%pre%\n' '\n%pre%' | head -n 2 | tr '%pre%\n' '\n%pre%'
' -v ORS='%pre%' 'NR==3 {exit} {print}'
' -v ORS='%pre%' 'NR <= 2 {print}'
\n' '\n%pre%' | head -n 2 | tr '%pre%\n' '\n%pre%'
' -v ORS='%pre%' 'NR==3 {exit} {print}'
' -v ORS='%pre%' 'NR <= 2 {print}'

Isso pode ser reduzido para gawk -v RS='head' -v ORS='head' 'NR <= 2' , pois a impressão do registro é a ação padrão.

Para um arquivo grande, é melhor você sair depois da segunda linha.

%pre%

Como alternativa, você pode usar %code% . Não há nenhuma opção para usar um byte nulo em vez de uma nova linha como o separador de registro, mas você pode trocar os dois caracteres, chamar %code% e então trocar de volta.

%pre%     
por 06.08.2013 / 03:22