有人可以告诉我这是做什么的吗?
cat infile|
awk '
{
for(i=3;i<=NF;i++){ $2=$2" "$i }
printf "%-4s %s\n", $1,$2 ;
}' > outfile.txt
infile
包含:
1 John Smith
2 Bill Johnson
...
5000 George Heiz
我看到结果是outfile.txt
所有线条都对齐,但我不明白
这部分具体是for(i=3;i<=NF;i++){ $2=$2" "$i }
做什么的?
答案1
这个 awk 脚本是一种复杂且低效的方法,可以用这种方式重写:
awk '
{
f=$1
$1=""
printf "%4d %s\n",f,$0 ;
}' infile > outfile.txt
后一个脚本在 f 变量中记录第一个字段,然后清除它,然后打印按四个字符对齐的 f 变量,然后保持原始行的其余部分不变。
我猜作者没有弄清楚如何格式化第一个字段,同时保留其余记录,因此将所有剩余字段放入带有奇数循环的第二个字段中。
编辑:
rici 甚至建议了一种更简单的方法:
awk '{$1 = sprintf("%4d", $1); print}' infile > outfile.txt
这个只是用其格式化表示替换第一个字段并输出该行。
答案2
对于这些awk
脚本,我总是发现最好将它们分解,这样我就可以看到发生了什么。
打印函数
这个很容易。这将格式化原始列的输出$1
,并$2
对该列$1
进行填充,使其占用 4 个空格。
例子
$ cat infile | awk '
{
for(i=3;i<=NF;i++){ $2=$2" "$i }
printf "%-4s DDD\n", $1 ;
}'
1 DDD
2 DDD
DDD
5000 DDD
for循环
这个检测起来有点棘手,但它会获取任何 3 或更大的列并将它们连接到 column $2
。
$ cat infile | awk '
{
for(i=3;i<=NF;i++){ $2=$2" "$i }
printf "%s | %s\n", $2,$3 ;
}'
John Smith | Smith
Bill Johnson | Johnson
|
George Heiz | Heiz
这使得它稍微容易一些,但实际上,如果我们添加第四列,infile
那就更明显了:
$ cat infile
1 John Smith 4thcol
2 Bill Johnson 4thcol
5000 George Heiz 4thcol
例子
$ cat infile | awk '
{
for(i=3;i<=NF;i++){ $2=$2" "$i }
printf "%s\t|\t%s\n", $2,$3 ;
}'
John Smith 4thcol | Smith
Bill Johnson 4thcol | Johnson
|
George Heiz 4thcol | Heiz
如果我们添加第 5 列,依此类推,它们将继续附加到$2
.
答案3
您将格式化命令printf
作为第一个参数字符串。 %-4s
指示输出分配 4 个字符并左对齐。然后,有一个空格,后面是字符串,用 表示%s
。