Anexa string após cada linha, exceto linha de cabeçalho e rodapé

1

Eu quero acrescentar algumas strings após cada linha do arquivo, exceto o cabeçalho e rodapé dos arquivos. Então, usei o comando abaixo para alterar o intervalo das linhas, exceto cabeçalho e rodapé, mas excluindo cabeçalho e rodapé, e não desejo excluir as linhas de cabeçalho e rodapé.

sed -n '2,5p; '"$str_var"'' abc.dat > abc.dat.temp

até eu tentei pular o cabeçalho e modifiquei outras linhas usando o comando abaixo mas sem opções para a linha de rodapé / trailer para mantê-lo como não alterado.

sed '1! s/$/'"$str_var"'/g' abc.dat > abc.dat.temp

sugestões de como alterar todas as linhas do arquivo, exceto a linha de cabeçalho e rodapé, e o comando não deve excluir a linha de cabeçalho / rodapé.

    
por chinmaya Das 05.06.2018 / 18:29

5 respostas

0

Com awk , para um arquivo com qualquer número de linhas:

$ awk -v last=$(wc -l < input) 'NR!=1 && NR!=last { print $0 " and more stuff" } NR==1||NR==last { print }' input
header
foo and more stuff
bar and more stuff
baz and more stuff
quux and more stuff
freeble and more stuff
bletch and more stuff
footer

Obtenha o número de linhas no arquivo de entrada com wc , armazene isso em uma variável awk . Em seguida, imprima o cabeçalho e o rodapé sozinhos e todas as outras linhas com o sufixo:

NR!=1 && NR!=last {
   print $0 " and more stuff"
} 
NR==1 || NR==last {
    print
}
    
por 05.06.2018 / 18:54
6

Supondo que o cabeçalho e o rodapé são uma linha cada: para a primeira linha e a última linha, pule o processamento adicional. Cada linha é impressa por padrão.

$ seq 10 | sed '1n; $n; s/$/ hello/'
1
2 hello
3 hello
4 hello
5 hello
6 hello
7 hello
8 hello
9 hello
10
    
por 05.06.2018 / 18:50
1

Com sed e de maneira diferente, anexe a todas as linhas s/$/.../ exceto ! o primeiro 1 e q uit se fosse a última linha $ antecipadamente.

sed '$q ;1 !s/$/ append/' <(seq 10)
1
2 append
3 append
4 append
5 append
6 append
7 append
8 append
9 append
10

Ou usando awk :

awk 'BEGIN{ getline line} {print line; line=$0 " append";} END{print $0}' <(seq 10)
1
2 append
3 append
4 append
5 append
6 append
7 append
8 append
9 append
10
    
por 05.06.2018 / 19:20
0

Obrigado a todos pelas sugestões. Foi muito útil. Eu escrevi abaixo o comando para fazer o mesmo.

str_var = $ (awk -F '\ | \ ^' '{print $ 3}' abc.dat | head -1)

awk -v last = $ (wc -l < inputFile) -vl="$ str_var" '{if (NR == 1) {print $ 0} else if (NR == last) {print $ 0} else {print $ 0 l}} 'inputFile > outputFile

    
por 06.06.2018 / 12:05
0

Eu fiz pelo método abaixo

inputfile

10
20
30
40

comando

 for i in 'awk '{print NR}' inputfile| wc -l| awk '{print $1-1}''; do sed '2,'$i's/$/praveen/g' inputfile;done

saída

10
20praveen
30praveen
40
    
por 11.06.2018 / 20:15