我有一个该类型的文件:
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 参数,但我无法输出第一个字段前面的确切空格数
使用 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
最简单的方法是认识到您的字段是这样组成的:
[[: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