output.sh 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/bin/bash
  2. # 检查输入参数
  3. if [ $# -ne 1 ]; then
  4. echo "用法: $0 <csv文件>"
  5. exit 1
  6. fi
  7. csv_file="$1"
  8. txt_file="${csv_file%.*}.formatted.txt"
  9. # 使用awk处理CSV
  10. awk -F ',' '
  11. BEGIN {
  12. # 定义表格元素
  13. OFS = " | "
  14. hline_char = "-"
  15. }
  16. NR == 1 {
  17. # 读取表头
  18. for (i=1; i<=NF; i++) {
  19. gsub(/"/, "", $i) # 去除字段中的双引号
  20. header[i] = $i
  21. max_width[i] = length($i)
  22. }
  23. }
  24. NR > 1 {
  25. # 更新最大列宽
  26. for (i=1; i<=NF; i++) {
  27. gsub(/"/, "", $i) # 去除字段中的双引号
  28. w = length($i)
  29. if (w > max_width[i]) max_width[i] = w
  30. }
  31. }
  32. END {
  33. # 打印表头
  34. printf("|")
  35. for (i=1; i<=NF; i++) {
  36. printf(" %-"max_width[i]"s |", header[i])
  37. }
  38. printf "\n"
  39. # 打印分隔线
  40. printf("|")
  41. for (i=1; i<=NF; i++) {
  42. printf("%s", hline_char)
  43. for (j=0; j<max_width[i]+2; j++) printf("%s", hline_char)
  44. printf("|")
  45. }
  46. printf "\n"
  47. # 打印数据行
  48. while (getline line < "'"$csv_file"'") {
  49. if (++counter == 1) continue # 跳过表头
  50. $0 = line
  51. printf("|")
  52. for (i=1; i<=NF; i++) {
  53. gsub(/"/, "", $i)
  54. printf(" %-"max_width[i]"s |", $i)
  55. }
  56. printf "\n"
  57. }
  58. }' "$csv_file" > "$txt_file"