循环遍历多个文件中的行(bash)

循环遍历多个文件中的行(bash)

我正在尝试创建一个脚本,该脚本在文件中逐行运行,提取每个句子中的最后一个单词,然后执行我创建的另一个脚本(该脚本有效,称为中间脚本)并将所有这些作为单独的行打印。

由于某种原因,我陷入了无限循环。

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在该单词上执行您的脚本。

相关内容