ファイル内で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
その単語に対してスクリプトを実行します。