Disons que j'ai la chaîne suivante:
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)
Comment puis-je transformer cela en simplement
+12.0,+15.5,+9.0,+13.5
en bash?
listOfStuff mkString ", "
ou Haskellintercalate ", " listOfString
Réponses:
Vous pouvez utiliser
awk
etsed
:Ou si vous souhaitez utiliser un tuyau:
Pour le décomposer:
awk
est excellent pour gérer des données décomposées en champs-vORS=,
définit le "séparateur d'enregistrement de sortie" sur,
, ce que vous vouliez{ print $2 }
ditawk
d'imprimer le deuxième champ pour chaque enregistrement (ligne)file.txt
est votre nom de fichiersed
se débarrasse simplement de la fin,
et le transforme en une nouvelle ligne (si vous ne voulez pas de nouvelle ligne, vous pouvez le faires/,$//
)la source
awk -v ORS=| '{ print $1 }' DCMC.rtf | sed 's/,$/\n/'
je reçois une erreur{print $1}
sinon je n'obtiens que des virgules en sortiePropre et simple:
la source
cat thing | awk -F',' '{ print "'\''" $7 "'\' '" }' | paste -s -d ','
,'
comme délimiteur?dos2unix
) s'il y a des CRLF dans la chaîne.la source
la source
function | awk...
votre exemple?awk une doublure
la source
Cela devrait fonctionner aussi
la source
Cela pourrait fonctionner pour vous:
ou
ou
Pour chaque ligne du fichier; coupez le premier champ et les espaces suivants, coupez le reste de la ligne suivant le deuxième champ et ajoutez à l'espace d'attente. Supprimez toutes les lignes sauf la dernière où nous basculons vers l'espace d'attente et après avoir supprimé la nouvelle ligne introduite au début, convertissez toutes les nouvelles lignes en
,
's.NB Pourrait être écrit:
la source
Vous pouvez utiliser
grep
:qui trouve la chaîne commençant par
+
, suivie de n'importe quelle chaîne\S\+
, puis convertit les caractères de nouvelle ligne en virgules. Cela devrait être assez rapide pour les gros fichiers.la source
Essayez ce code simple:
la source
essaye ça:
la bonne chose est la partie facile de la suppression des caractères de nouvelle ligne "\ n"!
EDIT: un autre excellent moyen de joindre des lignes en une seule ligne avec sed est celui-ci:
|sed ':a;N;$!ba;s/\n/ /g'
obtenu d' ici .la source
Une solution écrite en pur Bash:
Résultat: + 12,0, + 15,5, + 9,0, + 13,5
la source
Je n'ai pas vu cette solution simple avec awk
la source
Avec perl:
la source
Vous pouvez également le faire avec deux appels sed:
Le premier appel sed supprime les données inintéressantes, et le second joint toutes les lignes.
la source
Vous pouvez également imprimer comme ceci:
Just awk: utiliser printf
la source
Une autre solution Perl, similaire à awk de Dan Fego:
-a
dit à perl de diviser la ligne d'entrée dans le tableau @F, qui est indexé à partir de 0.la source
Eh bien, la partie la plus difficile est probablement de sélectionner la deuxième "colonne" car je ne connais pas un moyen facile de traiter plusieurs espaces comme un seul. Pour le reste, c'est facile. Utilisez des substitutions bash.
la source