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