需要使用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