gpt4 book ai didi

bash - 反转文本文件中的任何行(rev 命令的实现)

转载 作者:行者123 更新时间:2023-11-29 09:29:23 31 4
gpt4 key购买 nike

我试着写了一段代码来旋转文本文件中的每一行。例如,给定下一行:

a b c

输出将是:

c b a

此脚本仅获取一个参数作为参数 - 文本文件的名称。另外,我想这样做对额外的空间很重要。即,给定下一行:

a b c

输出将是:

c b a

注释:输出将在一个同名的新文件中,只是后缀为 .rotate

我的代码:

#!/bin/bash

name_of_file=$1

first_step=1

while read line; do
length_of_line=`echo -n "${line}" | wc -c`
rotate_line=()
index_of_line=0
index_of_rotate=$(( length_of_line - 1 ))
while (( ${index_of_line} < ${length_of_line} )); do
rotate_line[${index_of_rotate}]="${line[@]:${index_of_line}:1}"
let index_of_line++
let index_of_rotate--
done

if (( ${first_step} == 1 )); then
echo "${rotate_line[@]}" > $1.rotate1
first_step=0
else
echo "${rotate_line[@]}" >> $1.rotate1
fi
done < ${name_of_file}

问题:
我不知道为什么,但是,鉴于这一行:

a b c

输出是:

c b a

多余的空间从哪里来?

评论:当我逐个字母地检查旋转数组时,没问题(没有多余的空格)- 但是,当我用 "${rotate_line[@]}" 打印它时,它添加了一个新空间.. 为什么

最佳答案

echo ${rotate_line[@]} 在数组的每个元素之间放置一个分隔符。

while read line; do
// get rid of old-fashioned backticks, we're sick of explaining.
length_of_line=$(echo -n "${line}" | wc -c)
rotate_line=()
index_of_line=0
index_of_rotate=$(( length_of_line - 1 ))
while (( ${index_of_line} < ${length_of_line} ));
do
rotate_line[${index_of_rotate}]="${line[@]:${index_of_line}:1}"
let index_of_line++
let index_of_rotate--
done
// output characterwise
for i in $(seq 0 $((length_of_line - 1)))
do
// deactivated file-in and out for easy debugging
echo -n "${rotate_line[i]}" # >> $1.rotate1
done
// for multiple lines, we need an echo here:
echo
done # < ${name_of_file}

以这种调试友好的方式,我们可以回显单行或者做

cat file | nih-rev.sh > file.rotate1 

快速测试导致快速答案。

由于我们逐个字符地放置数组,我们本可以这样做,同时向后读取行,从而摆脱整个第二个数组,但您想知道,在您的方法中什么不起作用,哪些如果我进一步重构代码,就会变得模糊不清。

关于bash - 反转文本文件中的任何行(rev 命令的实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49097914/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com