Solaris:如何在 awk 之上运行系统命令并将所有输出合并到一行中

Solaris:如何在 awk 之上运行系统命令并将所有输出合并到一行中

有这个特殊的要求,以下面提到的格式打印给定目录中的文件

filename1 <type of file> owner group
filename2 <type of file> owner group
$

列之间的分隔符是制表符。

我已经能够编写以下命令,但system命令的输出引入了我希望避免的新行

find . -type f | xargs -I{} ls -let {} | awk -F" " 'BEGIN{OFS="\t" ORS=":"} {cmd=sprintf("file \"%s\"", $10);system(cmd);print $3,$4}'| tr -s ':\t ' '\t'

产生的输出如下
filename1 <type of file>
owner group filename2 <type of file>
owner group $

我知道该system命令负责我希望避免的新行 - 我出于同样的原因使用 ORS 但没有运气。
任何帮助将非常感激。

答案1

您可以从命令中使用管道 I/O awk(至少gawk,我还没有在 Solaris 上测试过这一点):

find . -type f | xargs ls -l | awk 'BEGIN { OFS="\t" } { command=sprintf("file \"%s\"", $9); command | getline type; close(command); print type, $3, $4 }' | tr ":" "\t"

如果你find支持它,你可以简化它

find . -type f -ls | awk ...

有一个方便的使用资源getline其中涵盖了许多注意事项(包括close()不像我最初那样使用)。

相关内容