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

问题描述 投票:1回答:1

我正在尝试在名为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之间有7个空间,在abcdddd之间有6个空间,在dddeee之间有一个空间。

另一个例子:

按命令运行程序后:

example7 F1 -8 -7 6 4 5

输出:

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

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

我尝试过这样的事情:

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

但它只适用于一个数字和一个参数,我不知道我怎么能为多列和多个参数做..任何帮助将不胜感激。

linux bash shell unix awk
1个回答
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]一样。

© www.soinside.com 2019 - 2024. All rights reserved.