如何在awk中使用空格或制表符分隔字段


51

在玩游戏时,awk我开始执行:

ls -la >> a.txt ; awk {'print $5  $1'} a.txt ;

这给出如下输出:

53277-rw-------
52347-rw-------

如何在这两个输出朋友之间留出空间?


1
作为建议,您不应解析的输出ls。这迟早会咬你的背。
gniourf_gniourf 2012年

在awk中,要串联两个字符串,只需将它们并排放置print $5 $1
glenn jackman 2012年


2
@kenorb和亲密的选民,链接的重复项根本不是重复项。他们已经知道如何按前提(awk {'print $5 $1'} a.txt)打印字段。他们问如何在字段1和字段5之间放置空格。
kos

Answers:


72

只需将行更改为

ls -la >> a.txt ; awk {'print $5 "        " $1'} a.txt ;

这应该用空格打印输出。

希望这可以帮助。

编辑:

根据McNisse的建议,您可以使用printf,它将为您提供良好的输出格式

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;

4
printf功能提供了更好的控制,特别是如果您要格式化数字。printf("%s\t%s\n", $5, $1)
McNisse 2012年

以上答案中有错字吗?这5s是什么意思awk {'printf ("%5s\t%s\n", $5, $1)'}
维沙尔


8

获取标签的一种简单方法是:

awk {'print $5"\t"$1'}

5

我知道这是一个老话题,但是我只是在学习,发现这些帖子很有帮助。我最好的解决方案是使用gawk在变量之间插入空格。

ls -la | gawk '{print $1, $9}'

3
-1:没有新内容。gawkmawk或其他任何内容awk,如果您使用逗号,它们都会插入空格,这就是答案
大师

1
应该是ls -la | awk '{print $1, $9}'。正如大师所说,这gawk是没有必要的。
尼克·克劳福德

1

要在参数之间放置空格,只需添加" ",例如awk {'print $5" "$1'}

但是,建议解析lscommand的输出,因为它不可靠,并且输出的是人类而不是脚本。因此,请使用诸如find或的替代命令stat

这是使用GNU的示例stat

$ stat -t *
001.txt 23 8 81a4 501 20 1000004 242236402 1 0 0 1460260387 1460260239 1460260239 1460260194 4096
7c1c.txt 21 8 81a4 501 20 1000004 242236595 1 0 0 1460261322 1460260486 1460260486 1460260486 4096

它将打印出机器友好的输出(简洁格式),因此您可以获得所需的确切信息。然后使用-c使用特定的格式,或使用awkcutread得到正确的列。

检查stat --help其他选项。例如,要打印修改日期,请检查此示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.