如何在 Bash 中向左填充一列

如何在 Bash 中向左填充一列

我有一个 bash 脚本,可以打印以下结果:

120,900
1160,001
80,730
600,165
6,310
1111,203

我想留下这样的结果:

 120,900
1160,001
  80,730
 600,165
   6,310
1111,203

我已经使用该行在第二列中的逗号后面仅保留 3 个数字

awk '{ printf "\t" $1 "\t|\t" "%.3f\n", $2 }' MyFile.txt;

我怎样才能做到这一点?

答案1

使用printf而不是echo

$ cat 442817.sh
#!/bin/bash
numbers=(120,900 1160,001 80,730 600,165 6,310 1111,203)
for n in "${numbers[@]}"; do
  printf "%10s\n" "$n"
done
$ ./442817.sh
   120,900
  1160,001
    80,730
   600,165
     6,310
  1111,203

答案2

Awk解决方案:

awk 'FNR == NR{ len = length; if (len > max_len) max_len = len; next }
     { printf "%" max_len "s\n", $0 }' file.txt file.txt

输出:

 120,900
1160,001
  80,730
 600,165
   6,310
1111,203

或者通过 GNUcoreutils:

printf "%$(sort -nr file.txt | wc -L)s\n" $(cat file.txt)

答案3

$ column -t -s, file | sed 's/^\([0-9]*\)\( *\)/\2\1,/'
   120,900
  1160,001
    80,730
   600,165
     6,310
  1111,203

输出column将是

120   900
1160  001
80    730
600   165
6     310
1111  203

sed命令只是将两列之间的空格移动到行的开头,并在其位置插入逗号。

如果不需要最初的额外两个空格,请使用

$ column -t -s, file | sed -e 's/^\([0-9]*\)\( *\)/\2\1,/' -e 's/^  //'
 120,900
1160,001
  80,730
 600,165
   6,310
1111,203

相关内容