
sedコマンドはディレクトリ内のすべてのファイルを処理し、結果を新しいファイルに出力したいと思います。 fがval1.txtの場合、出力ファイル名はval1_ending.txtでなければなりません。これはechoとsedを使って試しましたが、うまくいきません。どんな助けでも大変感謝します。ありがとうございます!
files= ls *.txt
echo "${files}"
for f in ${files}$
do
echo $f
sed -n -e 's/Trial End/&/p' $f>` echo $f | sed 's/.txt$/_ended.txt/g' `
done
私の入力ファイルの行は次のとおりです。
3413476 999.3 549.3 1876.0 32768.0
3413477 1000.7 549.6 1880.0 32768.0
3413478 999.3 551.1 1875.0 32768.0
INPUT 3413485 127
END 3413485 SAMPLES EVENTS RES 59.84 45.82
MSG 3413491 Trial End 2
MSG 3414099 RECCFG CR 1000 0 0 R
出力で「Trial End」パターンを持つすべての行を見つけたいです。
MSG 3411256 Trial End 1
MSG 3413491 Trial End 2
MSG 3415678 Trial End 3
MSG 3417842 Trial End 4
MSG 3420114 Trial End 5
答え1
for file in *.txt; do
grep 'Trial End' "$file" >> "${file%.txt}_ended.txt"
done
私が使用するのは、ファイルがすでに存在する場合にのみ使用するものでは>>
ありません。ファイルを切り捨てて上書きするのではなく、ファイルに追加します。>
*_ended.txt
>>
もう一つのことは、再利用が容易ではないということです。これを一度実行すると、filename_ended.txt
次のファイルが生成されます。パターンマッチそれを処理すると、filename_ended_ended.txt
ファイルを取得できます。
将来、これらの潜在的な問題を回避するには、これらのファイルに別の拡張子を使用することをお勧めします(ただし、Unixの世界では拡張子は重要ではありません)。
for file in *.txt; do grep 'Trial End' "$file" >> "$file.ended"; done
答え2
grepを使うのはどうですか?以下を試してください。
for f in *.txt; do
out=$(echo ${f} | sed 's/.txt$/_ended.txt/')
grep 'Trial End' $f > $out
done