web-dev-qa-db-fra.com

Comment convertir en ligne?

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?

10
Annemieke Smet

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
4
souravc

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
15
heemayl

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
2
kos

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
1
Byte Commander

Utilisation de sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
1
techraf

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
1