[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 newswan 于 2024-7-19 00:22 编辑

假如知道最大宽度是10
  1. awk '{ printf "%-10s %-10s %-10s\n", $1, $2, $3 }' a.txt
复制代码

TOP

本帖最后由 newswan 于 2024-7-19 14:32 编辑

1 字体的宽度,夹杂中文,更纱一个字体,能完全对齐
2 中文的宽度,上面的所有方案,都没有计算中文宽度,用制表符处理误差,一旦前面中文过多,也不能对齐。

TOP

本帖最后由 newswan 于 2024-7-20 01:54 编辑

保存为 a.awk ,然后 awk -f a.awk a.txt
  1. BEGIN {
  2. FS = " "
  3. while ( getline < ARGV[1] ) {
  4. for (i = 1; i <= NF; i++) {
  5. if ( length($i) > maxlen[i] ) {
  6. maxlen[i] = length($i)
  7. }
  8. }
  9. }
  10. }
  11. {
  12. for (i = 1; i <= NF; i++) {
  13. printf "%-*s\t",maxlen[i],$i
  14. }
  15. printf "\r\n"
  16. }
复制代码
1

评分人数

TOP

powershell
  1. $file = Get-Content -Path "data.txt" -Encoding UTF8
  2. $maxlen = @(0) *10
  3. $file | ForEach-Object {
  4. $arr = $_  -split "\s+"
  5. for ( $i =0 ; $i -lt $arr.count ; $i++ ){
  6. if ( $maxlen[$i] -lt ($arr[$i]).length ) {
  7. $maxlen[$i] = ($arr[$i]).length
  8. }
  9. }
  10. }
  11. $maxlen = $maxlen -join " " -replace "( 0)*" -split "\s+"
  12. $file | ForEach-Object {
  13. $arr = $_  -split "\s+"
  14. $str = ""
  15. for ( $i =0 ; $i -lt $arr.count ; $i++ ){
  16. $str += ($arr[$i]).PadRight($maxlen[$i]," ") + "  "
  17. }
  18. write-host ( $str -replace "\s$","" )
  19. }
复制代码

TOP

本帖最后由 newswan 于 2024-7-21 15:54 编辑

回复 29# 娜美

前面发的都没计算全角字符
#36 #37  计算了全角,用 ":" 分隔字段

TOP

本帖最后由 newswan 于 2024-7-21 20:35 编辑

支持全角字符
awk -f format-table.awk data.txt
  1. function getWidth(str,LenStr,LenASC,LenHZ) {
  2. LenStr = length(str)
  3. LenASC = gsub( /[\x00-\x7F]/ , "" , str )
  4. LenHZ = length(str) / length("一")
  5. return  LenASC + LenHZ * 2
  6. }
  7. function getLengthHZ(str,LenHZ) {
  8. gsub( /[\x00-\x7F]/ , "" , str )
  9. LenHZ = length(str) / length("一")
  10. return  LenHZ
  11. }
  12. BEGIN {
  13. FS = " "
  14. while ( getline < ARGV[1] ) {
  15. for (i = 1; i <= NF; i++) {
  16. len = getWidth($i)
  17. if ( len > maxWidth[i] ) {
  18. maxWidth[i] = len
  19. }
  20. }
  21. }
  22. # print "--maxWidth--"
  23. # for ( i in maxWidth ) {
  24. # printf "%4s" , maxWidth[i]
  25. # }
  26. # printf "\r\n"
  27. # print "----"
  28. }
  29. {
  30. for (i = 1; i <= NF; i++) {
  31. LenHZ = getLengthHZ($i)
  32. printf "%-*s:" , maxWidth[i] + LenHZ , $i
  33. }
  34. printf "\r\n"
  35. }
复制代码
注意 第 35 行 由于 awk 环境不同,可能是 "+ LenHZ" 可能是 "- LenHZ"

TOP

本帖最后由 newswan 于 2024-7-21 19:56 编辑

支持全角字符
format-table.ps1 "in.txt" "out.txt"
  1. param(
  2. [String]$filenameIn ,
  3. [String]$filenameOut
  4. )
  5. $file = Get-Content -Path $filenameIn -Encoding UTF8
  6. $maxWidth = @{}
  7. $file | ForEach-Object {
  8. $arr = $_  -split "\s+"
  9. for ( $i = 0 ; $i -lt $arr.count ; $i++ ){
  10. $Width = ($arr[$i]).length + ( $arr[$i] -replace "[\x00-\x7F]","" ).length
  11. if ( $maxWidth[$i] -lt $Width ) {
  12. $maxWidth[$i] = $Width
  13. }
  14. }
  15. }
  16. $strTable = [System.Collections.ArrayList]@()
  17. $file | ForEach-Object {
  18. $arr = $_  -split "\s+"
  19. $str = ""
  20. for ( $i = 0 ; $i -lt $arr.count ; $i++ ){
  21. $LenHZ = ( $arr[$i] -replace "[\x00-\x7F]","" ).length
  22. $str += ($arr[$i]).PadRight( $maxWidth[$i] - $LenHZ , " " ) + ":"
  23. }
  24. [void]$strTable.add( $str ) #$str -replace "\s$",""
  25. }
  26. $strTable | Out-File -Encoding 'UTF8' -FilePath $filenameOut
复制代码

TOP

回复 40# buyiyang


对,由于 awk 使用环境不同,有的地方是 + 有的地方是 -

TOP

本帖最后由 newswan 于 2024-7-21 20:05 编辑

回复 42# 娜美

#36 #37 输出正确
输出到屏幕正确,保存到文件也应该正确,文件不能对齐,是因为编辑器的字体问题

TOP

返回列表