awk中的printf格式说明符不适用于多个参数

时间:2017-12-29 10:15:16

标签: linux bash shell unix awk

我试图在名为example7的Bash中编写程序脚本 它接受作为参数:文件名(让我们称之为文件1)和列表 数字(下面我们称之为列表1)以及程序需要做的是打印输出列中的列 通过列表1中的数字将它们重新安排到右侧或左侧后的文件1.(这可以通过使用awk的printf命令获得)。

实施例

假设F1文件的内容是:

A abcd ddd eee zz tt
ab gggwe 12 88 iii jjj
yaara yyzz 12abcd xyz x y z

按命令运行程序后:

example7 F1 -8 -7 6 4

输出:

A       abcd      ddd eee
ab      gggwe      12 88
yaara   yyzz   12abcd xyz

AABCD之间的上述示例中,abcdddd之间有7个空格 dddeee之间有6个空格 有一个空间。

另一个例子:

按命令运行程序后:

example7 F1 -8 -7 6 4 5

输出:

A       abcd      ddd eee   zz
ab      gggwe      12  88  iii
yaara   yyzz   12abcd xyz    x

AABCD之间的上述示例中,abcdddd之间有7个空格 dddeee之间有6个空格 在eeezz之间有一个空格,88iii之间有3个空格 有两个空格,xyzx之间有4个空格。

我尝试过这样的事情:

file=$1
shift
awk '{printf "%'$1's\n" ,$1}' $file

但它只适用于一个数字和一个参数,我不知道如何为多列和多个参数执行此操作。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

awk变量设置为所有剩余参数,然后将其拆分并循环遍历它们。

file=$1
shift
awk -v sizes="$*" '{words = split(sizes, s); for(i = 1; i <= words; i++) printf("%" s[i] "s", $i); print ""; }' "$file"

尝试将shell变量直接替换为awk脚本通常是错误的。您应该更喜欢使用awk设置-v变量,然后使用awk自己的字符串连接操作,就像我使用s[i]一样。