sedを使用してディレクトリ内のすべてのファイルを変更し、それに応じて出力名を指定します。

sedを使用してディレクトリ内のすべてのファイルを変更し、それに応じて出力名を指定します。

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

おすすめ記事