摆脱角色

摆脱角色
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

创建一个文件,其中的标题看起来像

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

问题是,当我们查看打印结果时,发现最后 n 个是

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

因此,nt 1600 之后还有一些东西 - 我怎么会\t在 awk 中丢失这最后一个?或者在某个地方?

\t我在这里谈论的是最后一个\t n 1 5 9 8 \t n 1 5 9 9 \t n 1 6 0 0 \t \n- 我需要换行符 - 两个答案都没有解决这个问题。

我确实需要

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

必须有一个换行符。

答案1

假设您正在谈论\n,如果您不希望出现换行符,请使用cat来连接这些文件而不是 awk:

cat file_a file_aa > newfile

区别:

$ 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   

由于您想删除尾随的\t,请尝试:

sed -i 's/\t*$//' file_a
awk '{print}' file_a file_aa
  • \t*$是行尾的任意数量的制表符$

效果:

$ 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

答案2

如果需要换行符,只需添加一个

{ 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

或者,没有临时文件:

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

或者,无需明确删除尾随制表符:

(                    # 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

答案3

该选项卡在那里是因为您正在添加它:

printf "%s\t" 

这将打印您输入的每个字符串,后面跟着一个制表符。因此,最后一个字符串后面也会有一个制表符。为了避免这种情况,您可以在创建字符串后使用sed或类似工具将其删除(请参阅@muru 的回答),或者您可以使用其他工具来创建它。例如 perl

perl -le 'print "NT\tn", join("\tn",(1..1600)), "\nR\tcha\t2\t987\n"' > newfile

相关内容