2010-11-27 4 views
3

j'ai pu extraire certaines lignes d'un grand fichier texte séparé par des tabulations et les écrire dans un autre fichier:commande sed pour obtenir nième valeur séparée de tabulation entre les lignes x et y

sed -n 100,200p file.tsv >> output.txt 

Cependant, je suis en train d'essayer de saisir la 8e valeur séparée par des tabulations de chaque ligne et les écrire dans un fichier séparés par des virgules, mais je ne peux pas trouver la bonne syntaxe à utiliser pour le filtrage, malgré la lecture de dizaines d'articles en ligne.

Pour chaque fois que je essentiellement essayé de correspondre

$2 dans /([^\t]*\t){7}([0-9]*).*/

sans chance.

Les lignes dans le fichier texte file.tsv ressemblent:

01 name1 title1 summary1 desc1 image1 url1 120019 time1 
02 name2 title2 summary2 desc2 image2 url2 576689 time2 

S'il vous plaît quelqu'un peut me aider à cette requête?

+0

pourriez-vous fournir une ligne d'échantillon? –

+0

J'ai ajouté le format ci-dessus, et j'ai essayé plutôt mal avec des commandes telles que: 'sed -e '100,/start/s/[^ \ t] \ t [^ \ t] \ t [^ \ t] \ t [^ \ t] \ t [\ t ^] \ t [^ \ t] \ t [^ \ t] \ t // '-e'/stop /, 200 s/\ t. * // 'file.tsv' – Donna

Répondre

1

Ici, il utilise GNU sed et expressions étendues:

sed -nre '100,200{s/^(\S+\s+){7}(\S+).*$/\2/;p}' file.tsv 

Ici, il utilise seulement POSIX:

sed -n '100,200{s/^\([^[:space:]]\+[[:space:]]\+\)\{7\}\([^[:space:]]\+\).*$/\2/;p}' file.tsv 

je d'accord avec Alf que awk serait un meilleur ajustement pour cela.

Voici la solution awk avec les limites de la ligne:

awk 'NR==100,NR==200{print $8}' file.tsv 
+0

Si vous devez conserver des espaces blancs autres que des tabulations, remplacez tout [[: space:] 'par' \ t' dans la version POSIX. –

+0

C'est idéal. Merci pour cette solution. Vous avez parfaitement résolu mon problème et je peux voir comment je pourrais le modifier. Votre aide est tres apprecie. – Donna

+0

de rien –

1

Je pense que je préférerais utiliser awk cette façon:

$ awk '{ print col 8 : $8 }' file 

Le travail avant sera plus facile, je suppose.

+0

Merci pour votre réponse, malheureusement, je ne suis pas familier avec la façon d'utiliser cette syntaxe avec des fichiers à onglets. – Donna

2

A Perl one-liner:

perl -F'\t' -ane 'push @csv, $F[7] if $. > 100 && $. < 200; END { print join ",", @csv if @csv }' /path/to/input/file > /path/to/output/file 
+0

Salut, Merci pour votre réponse rapide! Cela semble idéal. Le seul problème pour nous, les données sont séparées par des tabulations au lieu d'être séparées par des virgules, de sorte qu'elles ne correspondent pas aux colonnes de droite. Comment pourrais-je faire ce changement s'il vous plaît? – Donna

+0

Don: Bonjour. Je vous en prie. J'ai édité ma réponse pour ajouter un '\ t 'explicite comme séparateur de champs. Cela devrait fonctionner maintenant. –

+0

Merci pour votre aide. Je vais essayer maintenant. – Donna

0

Cela fonctionnera s'il y a des champs vides.

sed -nre '100,200{s/^(([^\t]*)\t){7}([^\t]*)(\t.*|$)/\3/;p}' file.tsv 
Questions connexes