这个awk如何对齐间距?

这个awk如何对齐间距?

有人可以告诉我这是做什么的吗?

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

相关内容