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