需要使用AWK按相同顺序打印列

需要使用AWK按相同顺序打印列,awk,Awk,我有一个用两个或多个空格分隔的文件,如下所示: r_q01 smip_sc_rq0_t r_uq02 r_q02 super_path77/dfpp_tcdxa1_t umc3 r_q02 super_path3/dfppoi_tcdxa1_t r_q01 r_q03 super_0/cbo_bqibif0_t ntb0 r_q0367 super_top_0/nbio_nbif0_t nbif4 我想按相同的顺序

我有一个用两个或多个空格分隔的文件,如下所示:

r_q01     smip_sc_rq0_t   r_uq02  
r_q02     super_path77/dfpp_tcdxa1_t   umc3  
r_q02     super_path3/dfppoi_tcdxa1_t   r_q01  
r_q03     super_0/cbo_bqibif0_t   ntb0  
r_q0367     super_top_0/nbio_nbif0_t   nbif4  
我想按相同的顺序打印列,并尝试了以下代码:

#!/bin/bash
awk -F'  +' '{print $1 "        " $2 "                                                      " $3}' file.txt
我的输出:

r_q01        smip_sc_rq0_t                                                      r_uq02
r_q02        super_path77/dfpp_tcdxa1_t                                                      umc3
r_q02        super_path3/dfppoi_tcdxa1_t                                                      r_q01
r_q03        super_0/cbo_bqibif0_t                                                      ntb0
r_q0367        super_top_0/nbio_nbif0_t                                                      nbif4
实际产量:

r_q01        smip_sc_rq0_t                                                    r_uq02
r_q02        super_path77/dfpp_tcdxa1_t                                       umc3
r_q02        super_path3/dfppoi_tcdxa1_t                                      r_q01
r_q03        super_0/cbo_bqibif0_t                                            ntb0
r_q0367       super_top_0/nbio_nbif0_t                                        nbif4
如何修复我的代码以获得实际输出。

使用选项卡as OFS并将awk的输出传输到列-t以获得表格输出:

awk -F ' {2,}' -v OFS='\t' '{$1=$1} 1' file | column -t

如果您只想让字段对齐,请使用设置字段宽度的左对齐方式尝试printf,例如-

$: awk '{ printf "%-10s%-32s%s\n", $1,$2,$3 }' test
r_q01     smip_sc_rq0_t                   r_uq02
r_q02     super_path77/dfpp_tcdxa1_t      umc3
r_q02     super_path3/dfppoi_tcdxa1_t     r_q01
r_q03     super_0/cbo_bqibif0_t           ntb0
r_q0367   super_top_0/nbio_nbif0_t        nbif4

我将字段宽度设置为10,32,最后一个字段保持不变;调整到你的需要。%left后面的破折号是正确的。

添加一个通用解决方案,其中不硬编码空格数。这将计算第一个和第二个字段元素的最大长度,然后相应地填充第一个和第二个字段后面的空格。这将等于第1、第2和第3个字段之间的空间

awk '
FNR==NR{
  first=(first>=length($1)?first:length($1))
  second=(second>=length($2)?second:length($2))
  next
}
{
  diff1=first-length($1)-1
  $1=sprintf("%-"first"s", $1)
  diff2=second-length($2)-1
  $2=sprintf("%-"second"s", $2)
  diff1=diff2=0
}
1
'  Input_file Input_file

期望输出是什么?@Paulo我想我的输出:问题中的实际输出,而实际输出:是期望输出。@Kavitha为什么设置FS?在您的示例输入中没有单独的空格或制表符,因此默认的FS(由任何空格分隔)是否可以正常工作?您真的希望输出最后一行的第二个字段缩进比上面的行多1个空白字符吗?如果是,请解释逻辑,如果不是,请修复您的示例。OP使用2+空格作为其FS,因此a他们不需要,b他们的数据可以包含单个空格,和/或c他们的数据可以包含制表符。若c为true,那个么将s设置为tab将最终将包含tab的字段拆分为单独的字段。我已经为这篇专栏文章发帖了。我怀疑你的答案是正确的,但是设置FS是不必要的,即a,但我们会看到的。当然好的观点Ed.OP可以使用awk-F'{2,}'-v of s='\3'{$1=$1}1'f | column-t-s$'\3'如果\t可以在数据中的任何位置找到,则假定inputI love中不存在控制字符\3,这也会根据任何字段中的最大值动态调整输出大小,而无需手动计算:
awk '
FNR==NR{
  first=(first>=length($1)?first:length($1))
  second=(second>=length($2)?second:length($2))
  next
}
{
  diff1=first-length($1)-1
  $1=sprintf("%-"first"s", $1)
  diff2=second-length($2)-1
  $2=sprintf("%-"second"s", $2)
  diff1=diff2=0
}
1
'  Input_file Input_file