我正在尝试在名为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
在上面的例子中,A
和ABCD
之间有7个空间,在abcd
和ddd
之间有6个空间,在ddd
和eee
之间有一个空间。
另一个例子:
按命令运行程序后:
example7 F1 -8 -7 6 4 5
输出:
A abcd ddd eee zz
ab gggwe 12 88 iii
yaara yyzz 12abcd xyz x
在上面的例子中A
和ABCD
有7个空间,abcd
和ddd
之间有6个空间,ddd
和eee
之间有一个空间,eee
和zz
之间有3个空间,88
和iii
之间有两个空间,介于两个空间之间xyz
和x
有4个空格。
我尝试过这样的事情:
file=$1
shift
awk '{printf "%'$1's\n" ,$1}' $file
但它只适用于一个数字和一个参数,我不知道我怎么能为多列和多个参数做..任何帮助将不胜感激。
将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]
一样。