複数のファイルの行を繰り返します。

複数のファイルの行を繰り返します。

ファイル内で1行ずつ実行し、各文の最後の単語を抽出してから、私が作成した別のスクリプト(中間スクリプトと呼ばれる)を実行し、これらすべてのスクリプトを別々の行に印刷するスクリプトを作成しようとしています。 。

何らかの理由で無限ループに陥った。

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あなたの質問に記載されているように行われている活動によれば、これらすべての項目を置き換えるために1つだけが必要になるようです。

awk '$NF' infile*.txt > outfile.txt

$NF各行の最後の単語を表します(周囲にスペースがある単語を意味します)awk

上記の解決awk策が存在している間は、配列として行を読み取り、その配列の最後の要素を負のインデックス(bash 4.3以降)として印刷できます。

arrayedline=( $line ) 
printf "%s\n", "${arrayedline[@]-1}"

以前のバージョンでは、配列長の部分文字列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その単語に対してスクリプトを実行します。

関連情報