usando sed para modificar todos os arquivos em um diretório e nomear as saídas de acordo

1

Eu quero que o comando sed funcione em todos os arquivos em um diretório e envie o resultado para um novo arquivo. Se f é val1.txt, o nome do arquivo de saída deve ser val1_ended.txt - é o que estou tentando fazer com echo e sed, mas não funciona. Qualquer ajuda seria apreciada. Obrigada!

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

Nos meus arquivos de entrada, as linhas são assim:

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

Enquanto na saída, eu quero todas as linhas onde ele encontra o padrão "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
    
por user2484316 16.03.2016 / 01:32

2 respostas

3
for file in *.txt; do
  grep 'Trial End' "$file" >> "${file%.txt}_ended.txt"
done

Estou usando >> em vez de > apenas no caso de existir um dos arquivos *_ended.txt - >> será anexado ao arquivo em vez de truncá-lo e substituí-lo.

Outra coisa sobre isso é que não é muito reutilizável. Se você já executou uma vez, você terá filename_ended.txt arquivos que correspondem ao padrão e serão processados, e você terá filename_ended_ended.txt arquivos.

É melhor você usar outra extensão para esses arquivos para evitar esse possível aborrecimento no futuro (e, a propósito, extensões não importam muito no mundo Unix).

for file in *.txt; do grep 'Trial End' "$file" >> "$file.ended"; done
    
por 16.03.2016 / 02:13
0

Que tal usar o grep? Tente o seguinte:

for f in *.txt; do
out=$(echo ${f} | sed 's/.txt$/_ended.txt/')
grep 'Trial End' $f > $out
done
    
por 16.03.2016 / 02:13