摆脱性格

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 .... 

问题在于,当看到它如何打印时,结果certificate它在最后的n中是

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

所以有一些东西在1600之后 – 我怎么能在awk中输掉最后一个? 还是某个地方?

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

我确实需要

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

必须有换行符。

假设您正在讨论\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 

如果您需要换行,只需添加一行

 { 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 

选项卡是因为您要添加它:

 printf "%s\t" 

这将打印你给它的每个字符串,然后是一个标签。 所以,最后一个字符串也会有一个标签。 为避免这种情况,您可以在使用sed或类似工具创建它之后删除它(请参阅@ muru的答案 ),或者您可以使用其他工具来创建它。 例如, perl

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