我正在尝试创建一个脚本,该脚本在文件中逐行运行,提取每个句子中的最后一个单词,然后执行我创建的另一个脚本(该脚本有效,称为中间脚本)并将所有这些作为单独的行打印。
由于某种原因,我陷入了无限循环。
function find_id {
next_file="${*:2}"
temp_file="`echo $next_file | cut -d"." -f1`"
if [[ $temp_file != station ]]; then
while read line; do
if [[ -f "${temp_file}.station" ]]; then
train_col=$((${#line[*]}-1))
$train_id=`echo ${line[${train_col}]}`
echo -n "`intermediate $train_id`"
fi
done < ${temp_file}.station
next_file="`echo $next_file | cut -d"." -f2- | cut -d" " -f2-`"
temp_file="`echo $next_file | cut -d"." -f1`"
echo "`find_id $1 $next_file`"
fi
}
file_list= `ls *.station``
echo "`find_id $1 $file_list``" | sort -n | cut -d" " -f2- | uniq
我不允许使用 awk 或 sed。
答案1
根据您问题中所解释的您正在做的活动,您似乎只需要一个awk
来代替所有这些事情。
awk '$NF' infile*.txt > outfile.txt
指$NF
的是 中每行的最后一个单词(意味着周围有空格的单词)awk
。
虽然上面的awk
解决方案存在,但您可以使用 can read 行到数组并打印带有负索引的该数组的最后一个元素(bash 4.3 及更高版本)。
arrayedline=( $line )
printf "%s\n", "${arrayedline[@]-1}"
在旧版本中,bash
您可以在索引中使用表达式arrayedline[${#arrayedline[@]-1}]
,它使用数组长度中的子字符串一,${#arrayedline[@]}
我们可以获取该数组的最后一个元素。
arrayedline=( $line )
printf "%s\n", "${arrayedline[${#arrayedline[@]}-1]}"
或者你甚至可以使用如下:
printf "%s\n", "${arrayedline[@]:(-1)}" #or
printf "%s\n", "${arrayedlne[@]: -1}"
现在bash
数组中的索引是从 开始的0
。
答案2
以下是您可以通过以下任何一个都不能使用的附加要求来做到这sed
一点:
for i in `split -n 1 fn* --filter='cat | rev | cut -f 1 -d 'f' | rev'`; do ./yourscript.sh $i; done
其工作原理的解释:
split
将文件名以 开头的文件分成fn
几行,并cat | rev | cut -f 1 -d ' ' | rev
在每一行上进行处理。
cat
回显该行,rev
反转它,cut
将其分成由 分隔的单词' '
,并输出反转字符串的第一个单词,rev
将其反转;你得到了你的台词的最后一个词。
然后for...do...done
在该单词上执行您的脚本。