Comment convertir d'une ligne en colonne?

11

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 n'ai aucune idée de la commande à utiliser. Quelqu'un peut-il m'aider avec ça?

Annemieke Smet
la source

Réponses:

5

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
souravc
la source
1
xargs est un excellent outil, et si vous ne l'aviez pas mentionné, j'en aurais, mais il a un inconvénient en ce que si vous omettez la commande, il remplace echo (qui contrairement à certains shells, xargs n'a pas d'écho intégré) et -n1 indique à xargs d'appeler la commande pour chaque argument, donc avec cet exemple, vous auriez un minimum de six processus impliqués (le shell pour faire la redirection io, xargs et quatre échos). Ce n'est pas si mal à cette portée, mais c'est beaucoup plus lent à quelques milliers de lignes de sortie.
hildred
16

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
heemayl
la source
2

La réponse de heemayl est la voie à suivre, mais voici une alternative en utilisant Perl:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: active le traitement automatique de fin de ligne. Il a deux effets distincts. Tout d'abord, il compile automatiquement $ / (le séparateur d'enregistrement d'entrée) lorsqu'il est utilisé avec -n ou -p. Deuxièmement, il affecte $ \ (le séparateur d'enregistrements de sortie) pour avoir la valeur d'octnum afin que toutes les instructions d'impression aient ce séparateur ajouté à nouveau. Si octnum est omis, définit $ \ à la valeur actuelle de $ /.
  • -a: active le mode de fractionnement automatique lorsqu'il est utilisé avec -n ou -p. Une commande de division implicite au tableau @F est effectuée comme première chose à l'intérieur de la boucle while implicite produite par -n ou -p.
  • -n: oblige Perl à assumer la boucle suivante autour de votre programme, ce qui le fait parcourir 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 de sortie sur une nouvelle ligne;
  • print(@F): imprime les champs séparés par le séparateur de champs de 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
kos
la source
1

AWKapproche. Modification de base du séparateur de sortie pour les champs et 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
Sergiy Kolodyazhnyy
la source
1

En utilisant sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt
techraf
la source
Pas tout à fait ... cela ajouterait un retour à la ligne après chaque ligne (initiale).
heemayl
Vérifiez avec plusieurs lignes, vous obtiendrez alors un cas clair ..
heemayl
Pourriez-vous ajouter un exemple avec votre réponse ..
heemayl
@heemayl Vous vouliez dire que cela transformerait les espaces de fin en nouvelles lignes. Votre syntaxe n'est pas facile à comprendre. : /
techraf
1

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 Python 3 sur une ligne en guillemets simples avec le nom de fichier que vous souhaitez 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 sysmodule 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
Byte Commander
la source