将输出保存到字符串和文件bash脚本中

时间:2014-08-26 09:00:24

标签: bash

创建了一个程序,该程序使用文件作为输入并对文件中的字符进行排序。

file4="temp.txt"
name4=$(cat $file4)
echo $name4 |  sed 's/\(.\)/\1\n/g' > file4.txt

echo "enter how many rows :"
read cols

IFS=$'\n' a=($(cat file4.txt))
for j in $(seq ${#a[*]}); do
[[ ${a[$j-1]} = $name ]] && echo "${a[$i]}"
done

for (( i=0; i<=$(( ${#a[@]} / cols )); ++i )); do
for (( j=0; j<cols; ++j )); do
    if (( i%2 )); then idx=$(( (i + 1) / 2 * 2 * cols - j - 1 ))
    else idx=$(( (i / 2) * 2 * cols + j )); fi
    printf "%-4s  " "${a[idx]}"
done
printf "\n"
done

我得到了这个输出。

输出:

1   2   3   4   5   
10  9   8   7   6   
11  12  13  14  15  
        18  17  16

我希望将其保存在单行字符串中并保存到文件中。 现在的问题是它应该像这样排序

1 10 11 12 9 2 3 8 13 18 17 14 7 4 5 6 15 16

我用谷歌搜索,我得到的是从左到右的顺序保存

1 2 3 4 5 10 9 8 .....

任何想法如何?

1 个答案:

答案 0 :(得分:1)

我一次又一次地更新了我的答案:

#!/bin/bash

declare -a data

OIFS=$IFS
while read line; do
  let n=0
  IFS=,
  for item in $line; do
    data[$n]+="|$item"
    (( ++n ))
  done
  IFS=$OIFS
done < <(sed -r -e 's@[\t ]@,@g' "$file") 

display() {
  local val=$1
  if [ ! -z "$val" ]; then
    echo -n "$val "
  fi
}

for (( i = 0 ; i < ${#data[@]} ; ++i )); do
  IFS='|'
  declare -a array=( ${data[$i]} )
  IFS=$OIFS
  if (( i % 2 )); then
    for (( j = ${#array[@]} ; j >= 0 ; --j )); do
      display "${array[$j]}"
    done
  else
    for (( j = 0 ; j < ${#array[@]} ; ++j )); do
      display "${array[$j]}"
    done    
  fi
  echo -n ','
done

echo ';'

sed命令是必需的,因为默认IFS会拆分任何空格,制表符或换行符。您可以尝试使用IFS=' '

对于您在问题中提供的输入,将打印:

$ file=file ./test.bash 
1 10 11 ,,9 12 ,2 ,13 ,8 ,3 14 ,,7 15 18 ,4 ,17 ,6 ,5 16 ,,,;

这不是预期的输出,但我认为你应该在输出中添加列分隔符,以区别于空列而不是空格。