Estou trabalhando em um projeto no qual preciso remover toda a formatação de um arquivo de texto, incluindo espaços em branco e quebras de linha, e substituir os dois pontos por barras verticais. Fiz alguns progressos, mas não consigo encontrar uma maneira de mascarar as partes que precisam ser ignoradas. Sou novo no sed e sou apenas novato em scripts Bash e, na verdade, não tenho certeza se sed é a ferramenta certa para o trabalho (talvez vi? Normalmente uso Nano). O arquivo que estou tentando formatar é semelhante a este
== LUN mysql05-dbdat02 ==
LUNName: mysql05-dbdat02
CollectionStartTime: 2012-09-20T15:43:03-04:00
CollectionEndTime: 2012-09-20T15:43:34-04:00
Capacity
CurrentCapacity: 512
IOOperations
Reads: 100
Writes: 0
ReadsPerSecond: 0.000000
WritesPerSecond: 0.000000
ReadMBPerSecond: 0.000
WriteMBPerSecond: 0.000
TotalMBPerSecond: 0.000
NonOptimizedIOPerSecond: 0.000000
CacheHitPercentage: 0.000
PerformanceMetrics
TotalIOsPerSecond: 0.000
ReadIOsPerSecond: 0.000
WriteIOsPerSecond: 0.000
TotalMBPerSecond: 0.000
ReadMBPerSecond: 0.000
WriteMBPerSecond: 0.000
Performance
== LUN mysql05-dbdat02 ==
LUNName: mysql05-dbdat02
CollectionStartTime: 2012-09-20T15:43:03-04:00
CollectionEndTime: 2012-09-20T15:43:34-04:00
Capacity
CurrentCapacity: 512
IOOperations
Reads: 100
Writes: 0
ReadsPerSecond: 0.000000
WritesPerSecond: 0.000000
ReadMBPerSecond: 0.000
WriteMBPerSecond: 0.000
TotalMBPerSecond: 0.000
NonOptimizedIOPerSecond: 0.000000
CacheHitPercentage: 0.000
PerformanceMetrics
TotalIOsPerSecond: 0.000
ReadIOsPerSecond: 0.000
WriteIOsPerSecond: 0.000
TotalMBPerSecond: 0.000
ReadMBPerSecond: 0.000
WriteMBPerSecond: 0.000
Performance
e a saída precisa ser algo assim,
cm-data-unity01|LUNNam=cm-data-unity01|CollectionStartTim=2012-09-20T15:43:03-04:00|CollectionEndTim=2012-09-20T15:43:34-04:00|Capacity|CurrentCapacit=2048|IOOperations|Read=10|Write=90|ReadsPerSecon=8.000000|WritesPerSecon=76.000000|ReadMBPerSecon=0.430|WriteMBPerSecon=0.542|TotalMBPerSecon=0.973|NonOptimizedIOPerSecon=85.000000|CacheHitPercentag=0.000|PerformanceMetrics|TotalIOsPerSecon=84.000|ReadIOsPerSecon=8.000|WriteIOsPerSecon=76.000|TotalMBPerSecon=0.973|ReadMBPerSecon=0.430|WriteMBPerSecon=0.542|Performance|
ou, tudo em uma linha.
Eu escrevi um script Bash muito simples para formatá-lo, assim
# Author Christopher George Bollinger
# Comments: This script will modify the snippet.txt file.
# This script is meant to, first, take a specific bit of unformatted data and remove all line breaks and non-printable characters.
# Following this, the script is to replace any appropriate colons (those being used as delimiters) and replace them with the equals (=) character.
#!/bin/bash
echo "This script will remove line breaks, remove non-printable characters, and will replace colons used as field delimiters with the equals '(=)' character."
cp snippet.txt snippetwork.txt
RmLB ()
{
tr -d '\n' < snippetwork.txt > snippetwork1.txt
}
RmNonPrint ()
{
tr -cd "[:print:]" < snippetwork1.txt > snippetwork2.txt
}
RplcW ()
{
sed 's/: /=/g' snippetwork2.txt > snippetwork3.txt
}
RmWtSpc ()
{
tr -s ' ' '|' < snippetwork3.txt > snippetgood.txt
sed 'd/(?:[a-z]=) /'
}
QuChek ()
{
cat snippetgood.txt
read -p "Is this satisfactory? (Y/n)" Choice
case $Choice in
Y|y)
mv snippetgood.txt snippet.txt
rm -f snippetwork*
rm -f snippetgood.txt
;;
N|n)
exit
;;
*)
echo "Invalid Input."
;;
esac
}
read -p "Would you like to begin? (Y/n)" YorN
case $YorN in
Y|y)
RmLB
RmNonPrint
RplcW
RmWtSpc
QuChek
;;
N|n)
exit
;;
*)
echo "Invalid Selection"
;;
esac
Quais funções, exceto a saída, não estão corretas, dá:
==|LUN|mysql05-dbdat02|==|LUNName=|mysql05-dbdat02|CollectionStartTime=|2012-09-20T15:43:03-04:00|CollectionEndTime=|2012-09-20T15:43:34-04:00|Capacity|CurrentCapacity=|512|IOOperations|Reads=|100|Writes=|0|ReadsPerSecond=|0.000000|WritesPerSecond=|0.000000|ReadMBPerSecond=|0.000|WriteMBPerSecond=|0.000|TotalMBPerSecond=|0.000|NonOptimizedIOPerSecond=|0.000000|CacheHitPercentage=|0.000|PerformanceMetrics|TotalIOsPerSecond=|0.000|ReadIOsPerSecond=|0.000|WriteIOsPerSecond=|0.000|TotalMBPerSecond=|0.000|ReadMBPerSecond=|0.000|WriteMBPerSecond=|0.000|Performance|==|LUN|mysql05-dbdat02|==|LUNName=|mysql05-dbdat02|CollectionStartTime=|2012-09-20T15:43:03-04:00|CollectionEndTime=|2012-09-20T15:43:34-04:00|Capacity|CurrentCapacity=|512|IOOperations|Reads=|100|Writes=|0|ReadsPerSecond=|0.000000|WritesPerSecond=|0.000000|ReadMBPerSecond=|0.000|WriteMBPerSecond=|0.000|TotalMBPerSecond=|0.000|NonOptimizedIOPerSecond=|0.000000|CacheHitPercentage=|0.000|PerformanceMetrics|TotalIOsPerSecond=|0.000|ReadIOsPerSecond=|0.000|WriteIOsPerSecond=|0.000|TotalMBPerSecond=|0.000|ReadMBPerSecond=|0.000|WriteMBPerSecond=|0.000|Performance|
o problema é que os tubos aparecem seguindo os sinais de igual. Se alguém pudesse me indicar a direção certa para fazer isso da maneira certa, ou mesmo um recurso on-line para algum esclarecimento, ficaria imensamente grato.
O engraçado é que o jogo final para isso é que, embora a solicitação imediata seja formatar como no exemplo acima, alimentar isso em uma ferramenta gráfica cli Unix (meu palpite é gnuplot). Pelo que entendi, o gnuplot exige que a formatação esteja em colunas. Conforme mencionado, este é um território novo para mim e eu apreciaria muito qualquer conselho dado.
Responder1
Não tenho certeza do que você está tentando fazer. Usando seu primeiro arquivo de entrada, crio esta saída:
LUNName=mysql05-dbdat02|CollectionStartTime=2012-09-20T15:43:03-04:00|CollectionEndTime=2012-09-20T15:43:34-04:00|Capacity|CurrentCapacity=512|IOOperations|Reads=100|Writes=0|ReadsPerSecond=0.000000|WritesPerSecond=0.000000|ReadMBPerSecond=0.000|WriteMBPerSecond=0.000|TotalMBPerSecond=0.000|NonOptimizedIOPerSecond=0.000000|CacheHitPercentage=0.000|PerformanceMetrics|TotalIOsPerSecond=0.000|ReadIOsPerSecond=0.000|WriteIOsPerSecond=0.000|TotalMBPerSecond=0.000|ReadMBPerSecond=0.000|WriteMBPerSecond=0.000|Performance|
Com este perl um forro:
perl -pe 's/\n/|/;s/\s*//g; s/:/=/; END{print "\n"}' file
Você também pode fazer isso com isto:
sed -r 's/\s*//g; s/:/=/;' file | tr '\n' '|'
Responder2
sed -e ':a;N;$!ba;s/\n/\|/g;s/: */=/g;s/ *//g' '<yourinputfilehere>' > '<youroutputfilehere>'
explicação: a primeira parte: :a;N;$!ba;s/\n/\|/g
remove todas as quebras de linha e as substitui por | uma explicação melhor sobre a sintaxe está aqui:https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n
a 2ª parte, ;s/: */==/g
substitui todos os dois pontos seguidos por um ou mais espaços por ==
a terceira parte ;s/ *//g
remove todos os espaços singulares ou múltiplos.
obviamente, seu arquivo de entrada e arquivo de saída precisam ser substituídos. se você quiser evitar a saída de depuração em seu arquivo de saída, você pode adicionar 2> '/dev/null'
no final
Eu realmente não entendi qual era o seu plano com a sua opinião, mas você deve ser capaz de implementá-lo a partir daqui.