Digamos que eu tenha a seguinte string:
something1: +12.0 (some unnecessary trailing data (this must go))
something2: +15.5 (some more unnecessary trailing data)
something4: +9.0 (some other unnecessary data)
something1: +13.5 (blah blah blah)
Como faço para transformar isso em simplesmente
+12.0,+15.5,+9.0,+13.5
em bash?
listOfStuff mkString ", "
ou Haskellintercalate ", " listOfString
Respostas:
Você pode usar
awk
esed
:Ou se você quiser usar um cano:
Para dividir:
awk
é ótimo para lidar com dados divididos em campos-vORS=,
define o "separador de registro de saída" para,
, que é o que você queria{ print $2 }
dizawk
para imprimir o segundo campo para cada registro (linha)file.txt
é o seu nome de arquivosed
apenas se livra do rastro,
e o transforma em uma nova linha (se você não quiser uma nova linha, pode fazers/,$//
)fonte
awk -v ORS=| '{ print $1 }' DCMC.rtf | sed 's/,$/\n/'
estou recebendo um erro{print $1}
outra forma, estou recebendo apenas vírgulas na saídaLimpo e simples:
fonte
cat thing | awk -F',' '{ print "'\''" $7 "'\' '" }' | paste -s -d ','
,'
como delimitador?dos2unix
) se houver CRLFs na string.fonte
fonte
function | awk...
em seu exemplo?awk one liner
fonte
Isso deve funcionar também
fonte
Isso pode funcionar para você:
ou
ou
Para cada linha do arquivo; corte o primeiro campo e os espaços a seguir, corte o resto da linha a seguir ao segundo campo e acrescente ao espaço de espera. Exclua todas as linhas, exceto a última, onde trocamos para o espaço de espera e, após excluir a nova linha introduzida no início, converta todas as novas linhas em
,
's.NB pode ser escrito:
fonte
Você pode usar
grep
:que encontra a string começando com
+
, seguida por qualquer string e\S\+
, a seguir, converte os caracteres da nova linha em vírgulas. Isso deve ser muito rápido para arquivos grandes.fonte
Experimente este código fácil:
fonte
tente isto:
o bom é a parte fácil de deletar caracteres de nova linha "\ n"!
EDIT: outra ótima maneira de unir linhas em uma única linha com o sed é esta:
|sed ':a;N;$!ba;s/\n/ /g'
veio daqui .fonte
Uma solução escrita em puro Bash:
Resultado: + 12,0, + 15,5, + 9,0, + 13,5
fonte
Não vi esta solução simples com awk
fonte
Com perl:
fonte
Você também pode fazer isso com duas chamadas sed:
A primeira chamada sed remove dados desinteressantes e a segunda junta todas as linhas.
fonte
Você também pode imprimir assim:
Apenas awk: usando printf
fonte
Outra solução Perl, semelhante ao awk de Dan Fego:
-a
diz ao perl para dividir a linha de entrada no array @F, que é indexado a partir de 0.fonte
Bem, a parte mais difícil provavelmente é selecionar a segunda "coluna", já que não conheço uma maneira fácil de tratar vários espaços como um só. De resto, é fácil. Use substituições de bash.
fonte