如何使用 awk 保留第一个字段的初始空格

问题描述 投票:0回答:2

我有一个该类型的文件:

   aaaaaa bbbb     cccccc
     dddddddddddddd ee  fff
  gggggggg hhh   iiiii

我只想输出第一个和第三个字段,但保留第一个字段的原始空格,例如:

   aaaaaa cccccc
     dddddddddddddd fff
  gggggggg iiiii

如果我使用简单的

print($1,$3)
,我得到:

aaaaaa cccccc
dddddddddddddd fff
gggggggg iiiii

我尝试添加:

$1=sprintf("%20s",$1)
--> 但第一个字段在第 20 列的右侧对齐:

              aaaaaa cccccc
      dddddddddddddd fff
            gggggggg iiiii

提前感谢您的(简单)建议

PLP

我尝试使用 printf 参数,但我无法输出第一个字段前面的确切空格数

awk printf whitespace space
2个回答
0
投票

使用 GNU Awk,您可以使用

FPAT
定义字段模式。

例如,将字段定义为一些空格后跟一些单词字符,可以让您直接打印第一个和第三个字段,并在其前面添加各自的空格:

awk -vFPAT='\\s+\\w+' '{print $1 $3}'
   aaaaaa     cccccc
     dddddddddddddd  fff
  gggggggg   iiiii

如果您想自己控制间距,您可以将字段模式定义为匹配空格或单词字符,然后抓取并打印第一个、第二个和第六个字段以及静态空格字符串(或者只是一个逗号,因为输出字段分隔符默认为空格字符):

awk -vFPAT='\\s+|\\w+' '{print $1 $2 " " $6}' # or {print $1 $2, $6}
   aaaaaa cccccc
     dddddddddddddd fff
  gggggggg iiiii

0
投票

最简单的方法是认识到您的字段是这样组成的:

[[:space:]]+[^[:space:]]+

一旦看到这一点,您可以使用 awk、sed、Perl、Ruby 等来消除不需要的字段并打印想要的字段。

这是一个红宝石来做到这一点:

ruby -lne '
BEGIN{wanted=[0,2]}
puts $_.scan(/\s+\S+/).select.with_index{|c,i| wanted.include?(i) }.join ' file

或者 GNU awk:

gawk -v FPAT="[[:space:]]+[^[:space:]]+" '
BEGIN{wanted[1]; wanted[3]}
{for (i=1;i<=NF;i++) if (i in wanted) printf "%s%s", $i, i==NF ? ORS : ""}
' file 

任一打印:

   aaaaaa     cccccc
     dddddddddddddd  fff
  gggggggg   iiiii
© www.soinside.com 2019 - 2024. All rights reserved.