0

while ループで grep コマンドを使用すると問題が発生します。以下は私のコードです:

#!/bin/bash
#FILE:  grep_track
#will read in a list of track IDs and grep the track data from the original track files
set=-x

track_list=Top95_HSI_forGrep.txt
track_path="/mnt/gpfs/backup/jpty_surge/kimberly/Launch_multiple_storms/input/$track_list"
outname=$track_list

#echo track_list $track_list
#echo track_path $track_path
#echo outname $outname

IFS=$","
while read trackid fileid 
do
   file="input/track_param_$fileid"
   outfile="output/$outname"
   echo fileid $fileid
   echo trackid $trackid
   echo file $file
   echo outfile $outfile
   grep $trackid $file > $outfile 
done < $track_path

すべてが正しく読み込まれているように見えますが (私のエコー応答によると)、次のエラーが表示されます。

: No such file or directory1.txt

何が起こっているのかを理解するのを手伝ってくれる人はいますか? ありがとう!

4

1 に答える 1

1

あなたの議論を引用してくださいgrep

grep "${trackid}" "${file}" >> "${outfile}"

このように、$trackidまたはに空白が含まれている場合、複数の引数ではなく$file1 つの引数として扱われます。がファイル " " に追加grepされることに注意してください(切り捨てられるではなく)。>> ${outfile}>


\r入力ファイルから誤った s を削除するには、 tr(1)を使用します。

tr -d '\r' < "${track_path}" | while read trackid fileid 
# [...]
done

また、次のような健全性チェックもお勧めします。

if [[ -f "${file}" ]] ; then
    grep "${trackid}" "${file}" > "${outfile}"
else
    echo "Could not find file [${file}]. Skipping."
fi

したがって、完成したスクリプト次のようになります。

#!/bin/bash
#set -x

track_list=Top95_HSI_forGrep.txt
track_path="${1-/mnt/gpfs/backup/jpty_surge/kimberly/Launch_multiple_storms/input}/${track_list}"
outname="${track_list}"
output_directory="output"
outfile="${output_directory}/${outname}"

if [[ ! -f "${track_path}" ]]; then
    echo "Could not find track_path input [${track_path}]. Exiting"
    exit
fi

if [[ ! -d "${output_directory}" ]] ; then
    echo "Creating output directory [${output_directory}]..."
    mkdir -p "${output_directory}"
fi

IFS=$","
tr -d '\r' < "${track_path}" | while read trackid fileid
do
    file="input/track_param_${fileid}"
    if [[ -f "${file}" ]]; then
        grep "${trackid}" "${file}" >> "${outfile}"
    else
        echo "Could not find file [${file}]. Skipping."
    fi
done
于 2013-02-07T02:15:57.853 に答える