Awk - 如何更改最后一个字段的格式并保持其他字段的格式相同

Awk - How to change format of the last field and keep the format same for other fields

data="blue yellow red white foo.bar.com,foo.bar.eu" 

echo $data | awk '{printf "%-10s %-10s\n", , }'

给我以下输出:

blue foo.bar.com,foo.bar.eu

我希望输出如下所示,方法是用换行符替换最后一个字段中的逗号并对齐最后一个字段,如下所示。

blue foo.bar.com

foo.bar.eu

取决于您所说的“对齐”(制表符分隔或视觉表格)的含义:

$ echo "$data" | sed 's/ .* /\t/; s/,/\n\t/'
blue    foo.bar.com
        foo.bar.eu

$ echo "$data" | awk -F'[, ]' -v OFS='\t' '{print ,  ORS "", }'
blue    foo.bar.com
        foo.bar.eu

$ echo "$data" | sed 's/ .* /\t/; s/,/\n\t/' | column -s$'\t' -t
blue  foo.bar.com
      foo.bar.eu

$ echo "$data" | awk -F'[, ]' -v OFS='\t' '{print ,  ORS "", }' | column -s$'\t' -t
blue  foo.bar.com
      foo.bar.eu

使用sed

$ sed 's/\([^ ]*\).* \([a-z]*\.[a-z]*\.[a-z]*\),\(.*\)/\t\n\t/' input_file
blue    foo.bar.com
        foo.bar.eu

我只想在字段分隔符中添加逗号:

echo "blue yellow red white foo.bar.com,foo.bar.eu" |
awk -F '[[:blank:],]+' '{printf ("%-10s %s\n%-10s %s\n", , , "", )}'

# gives
blue       foo.bar.com
           foo.bar.eu
  • %-10s 表示让这个字符串至少有 10 个字符宽,必要时用 space 填充。 - 表示将字符串对齐到填充的 space 的左侧(而不是右侧)。
  • 你不应该这样做 %-10s\n - 这会在新行之前创建填充。
  • 要使第二行与第一行相同,可以使用空字符串。

这可能是您想要的:

echo "blue yellow red white foo.bar.com,foo.bar.eu,foo.baz.com" |
awk '{
    n=split(, a, ",")
    printf "%-10s %-10s\n", , a[1]
    for (i=2; i<=n; ++i) printf "%10s %-10s\n", "", a[i];
}'

输出:

blue       foo.bar.com
           foo.bar.eu
           foo.baz.com