创建了一个程序,该程序使用文件作为输入并对文件中的字符进行排序。
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 .....
任何想法如何?
答案 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 ,,,;
这不是预期的输出,但我认为你应该在输出中添加列分隔符,以区别于空列而不是空格。