J'ai un fichier .txt avec des numéros ordonnés comme ceci (sur la même ligne):
106849_01373 106849_01967 106850_00082 23025.7_01059
Je voudrais les convertir comme ça:
106849_01373
106849_01967
106850_00082
23025.7_01059
Je ne sais pas quelle commande utiliser. Quelqu'un peut-il m'aider avec ça?
En voici un avec xargs
xargs -n1 < file.txt
Démo:
$ cat file.txt
106849_01373 106849_01967 106850_00082 23025.7_01059
$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
Assez facile avec tr
:
tr -s '[:blank:]' '\n' <file.txt
Exemple:
% cat file.txt
106849_01373 106849_01967 106850_00082 23025.7_01059
106849_01373 106849_01967 106850_00082 23025.7_01059
106849_01373 106849_01967 106850_00082 23025.7_01059
106849_01373 106849_01967 106850_00082 23025.7_01059
% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
la réponse de heemayl est la voie à suivre, cependant voici une alternative utilisant Perl:
Perl -lane '$,="\n"; print(@F)' file.txt
-l
: active le traitement de fin de ligne automatique. Il a deux effets distincts. Premièrement, il chomps automatiquement $/(le séparateur d'enregistrement d'entrée) lorsqu'il est utilisé avec -n ou -p. Deuxièmement, il attribue à $\(le séparateur d'enregistrement de sortie) la valeur d'octnum afin que toutes les instructions d'impression ajoutent ce séparateur. Si octnum est omis, définit $\sur la valeur actuelle de $ /.-a
: active le mode autosplit lorsqu'il est utilisé avec un -n ou -p. Une commande de fractionnement implicite dans le tableau @F est effectuée en premier dans la boucle while implicite produite par -n ou -p.-n
: Perl assume la boucle suivante autour de votre programme, ce qui le rend itératif sur les arguments de nom de fichier un peu comme sed -n ou awk:
LINE:
while (<>) {
... # your program goes here
}
-e
: peut être utilisé pour entrer une ligne de programme;
$,="\n"
: définit le séparateur de champ en sortie sur une nouvelle ligne;print(@F)
: affiche les champs séparés par le séparateur de champs en sortie.% cat file.txt
106849_01373 106849_01967 106850_00082 23025.7_01059
% Perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
Je viens d'ajouter une solution Python pour le plaisir:
python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
Cette commande exécute le script à une ligne Python 3 entre guillemets simples avec le nom de fichier que vous voulez convertir en argument à la fin. La syntaxe est la suivante:
python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS
Le script à une ligne que nous utilisons est le suivant (étendu à plusieurs lignes pour plus de clarté):
import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")
Il importe le module sys
pour lire les arguments de ligne de commande, prend le premier argument donné comme nom de fichier à ouvrir et imprime chaque bloc de données séparé par des espaces du fichier sur une seule ligne.
$ cat mytestfile
106849_01373 106849_01967 106850_00082 23025.7_01059
106849_01373 106849_01967 106850_00082 23025.7_01059
106849_01373 106849_01967 106850_00082 23025.7_01059
106849_01373 106849_01967 106850_00082 23025.7_01059
$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
Utilisation de sed
:
sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
AWK
approche. En gros, changer le séparateur de sortie pour les champs et le bouclage. Le fichier de test est votre exemple collé encore et encore avec ENDLINE à la fin
$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE