Como obtenho a saída combinada que tem | (pipeline) na saída [closed]

0

Eu tenho um arquivo com o nome A.txt Eu tenho que criar um arquivo B.txt tal que tenha algum texto escrito em iniciar, com um símbolo de pipeline, além disso, seguindo com o não de linhas no arquivo A (10 linhas aqui neste exemplo) e, em seguida, o conteúdo do arquivo A .

Observação: tenho que fazer isso com a maior facilidade possível em um único comando de linha.

Saída:

Some text | 10
(Contents of file A)

Eu tentei isso (sem incluir o símbolo do pipeline), mas não funcionou:

(echo 'Some Text'; 
sed -i 1,10d A.txt ; 
wc -l A.txt ;cat A.txt) 
>> B.txt
    
por imabeast 05.03.2018 / 03:37

3 respostas

2

sed -i 1,10d A.txt apaga as linhas de 1 a 10 de A.txt , mas não imprime nada. cat do arquivo depois (mesmo dentro da mesma sub-casca) imprime o modificado conteúdo do arquivo, não o original.

    
por 05.03.2018 / 03:52
2

Se houver apenas 10 linhas em A.txt e você excluir essas linhas com sed , as seguintes cat A.txt não terão saída e wc reportará 0 linhas.

Você provavelmente quer algo como:

(
echo "Some text | $(wc -l < A.txt)"
cat A.txt
) > B.txt
    
por 05.03.2018 / 03:56
1
lines=$( wc -l A.txt ) ; printf "Some Text | %s\n" ${lines%% *} > B.txt ; cat A.txt  >> B.txt
  1. A saída de wc inclui o nome do arquivo, portanto, ele precisa ser removido, o que é feito usando o recurso de remoção do sufixo nativo do shell ${var%%glob} .

  2. Eu tenho uma preferência pessoal para usar como padrão printf em vez de echo porque echo tem casos em que se comporta mal.

  3. Realizar o redirecionamento de saída duas vezes garante que o arquivo de saída não inclua dados de uma execução anterior do one-liner; o primeiro redirecionamento > sobrescreve qualquer versão anterior.

por 05.03.2018 / 04:11

Tags