se livrar do personagem

0
printf "%s\t" Nt n{1..1600} >file_a
printf "%s\t" R cha 2 987 > file_aa
awk '{print}' file_a file_aa > newfile

para criar um arquivo no qual o cabeçalho se parece com

Nt /t n1 /t n2 /t n3 ....

o problema é que quando se olha como isso imprime, acontece que no último n é

\t   n   1   5   9   8  \t   n   1   5   9   9  \t   n   1   6
0   0  \t  \n

então existe algo depois do nt 1600 - como posso perder esse último \t no awk? Ou em algum lugar?

Eu estava falando sobre o último \t em que \t n 1 5 9 8 \t n 1 5 9 9 \t n 1 6 0 0 \t \n aqui - eu preciso do caractere de nova linha - as duas respostas não resolveram isso.

Eu preciso

printf "%s\t" Nt n{1..1600} >file_a
printf "%s\t" R cha 2 987 > file_aa

Tem que haver uma nova linha.

    
por user3069326 29.06.2015 / 13:00

3 respostas

2

Supondo que você esteja falando sobre \n , se você não quiser que essa nova linha apareça, use cat para unir esses arquivos em vez de awk:

cat file_a file_aa > newfile

A diferença:

$ awk 1  <(printf "%d\t" {1..2} ) <(printf "%d\t" {1..2} )
1   2   
1   2   
$ cat <(printf "%d\t" {1..2} ) <(printf "%d\t" {1..2} )
1   2   1   2   

Como você deseja excluir o \t à direita, tente:

sed -i 's/\t*$//' file_a
awk '{print}' file_a file_aa
  • \t*$ é qualquer número de abas no final da linha $ .

O efeito:

$ awk 1 <(printf "%d\t" {1..2} | sed 's/\t*$//') <(printf "%d\t" {1..2} ) | od -c              
0000000   1  \t   2  \n   1  \t   2  \t  \n
0000011
    
por muru 29.06.2015 / 13:05
1

Se você precisa de uma nova linha, basta adicionar um

{ printf "%s\t" Nt n{1..1600}; echo; } > file_a
{ printf "%s\t" R cha 2 987;   echo; } > file_aa
sed 's/\t$//'  file_a file_aa          > newfile

Ou, sem os arquivos temporários:

{ 
    printf "%s\t" Nt n{1..1600}; echo
    printf "%s\t" R cha 2 987;   echo
} | sed 's/\t$//' > newfile

Ou, sem precisar remover explicitamente as guias à direita:

(                    # in a subshell, so IFS is not modified in the current shell
    IFS=$'\t'
    head1=( Nt n{1..1600} ); echo "${head1[*]}"
    head2=( R cha 2 987 );   echo "${head2[*]}"
) > newfile
    
por glenn jackman 29.06.2015 / 15:25
1

A guia está lá porque você está adicionando:

printf "%s\t" 

Isso imprimirá todas as sequências que você fornecer seguidas por uma guia. Então, a última string também terá uma tabulação. Para evitar isso, você pode removê-lo depois de criá-lo usando sed ou ferramentas similares (veja resposta do @ muru), ou você pode usar uma ferramenta diferente para criá-lo. Por exemplo, perl :

perl -le 'print "NT\tn", join("\tn",(1..1600)), "\nR\tcha\t2\t987\n"' > newfile
    
por terdon 29.06.2015 / 14:46