LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

Ну нате на bash, с однократным чтением входного файла, со стандартного ввода, длинна слов не важна:

#!/usr/bin/env bash

declare -a file line
declare -i lines line_number words max_words word pass
f_old=$- ; set -f

readarray -t file
lines=${#file[@]}
for((pass=0; pass<2; pass++)); do
  for((line_number=0; line_number<lines; line_number++)); do
        line=( ${file[line_number]} )
        words=${#line[@]}
        if [[ pass -eq 0 ]]; then
          if [[ max_words -lt words ]]; then
                max_words=words
                commas=${line[@]/*/,}
                commas=${commas// /}
          fi
        else
          for((word=0; word<words; word++)); do
                echo -n ${commas::word==0?max_words-words:1}"${line[word]}"
          done
          echo
        fi
  done
done
[[ $f_old != *f* ]] && set +f

Исправление vodz, :

Ну нате на bash, с однократным чтением входного файла, со стандартного ввода, длинна слов не важна:

#!/usr/bin/env bash

declare -a file line
declare -i lines line_number words max_words word
f_old=$- ; set -f

readarray -t file
lines=${#file[@]}
for((pass=0; pass<2; pass++)); do
  for((line_number=0; line_number<lines; line_number++)); do
        line=( ${file[line_number]} )
        words=${#line[@]}
        if [[ pass -eq 0 ]]; then
          if [[ max_words -lt words ]]; then
                max_words=words
                commas=${line[@]/*/,}
                commas=${commas// /}
          fi
        else
          for((word=0; word<words; word++)); do
                echo -n ${commas::word==0?max_words-words:1}"${line[word]}"
          done
          echo
        fi
  done
done
[[ $f_old != *f* ]] && set +f

Исходная версия vodz, :

Ну нате на bash, с однократным чтением входного файла, со стандартного ввода, длинна слов не важна:

#!/usr/bin/env bash

declare -a file line
declare -i lines line_number words max_words word
f_old=$- ; set -f

find_max_fields() {
        file[$1]=$2 line=( $2 )
        if [[ max_words -lt ${#line[@]} ]]; then
                commas=${line[@]/*/,}
                commas=${commas// /}
                max_words=${#commas}
        fi
}

readarray -C find_max_fields -c 1
lines=${#file[@]}
for((line_number=0; line_number<lines; line_number++)); do
        line=( ${file[line_number]} )
        words=${#line[@]}
        for((word=0; word<words; word++)); do
                echo -n ${commas::word==0?max_words-words:1}"${line[word]}"
        done
        echo
done
[[ $f_old != *f* ]] && set +f