2010-06-21 6 views
3

J'ai compilé ce one-liner qui imprime tous les mots d'un fichier sur différentes lignes: sed -e 's/[^ a-zA-Z]/\ n/g 'test_input | grep -v "^ $"Linux bash - casse un fichier en 2 mots

Si test_input contient "Mon vélo est rapide et propre", la sortie de celui-liner sera:
Mon
vélo
est
rapide
et
propre

ce que je aurais besoin est maintenant une version différente qui imprime tous les dans le texte, comme celui-ci (toujours avec le Bash) termes 2-mot:
Mon vélo
vélo est
est rapide
rapide et
et propre

Est-ce que vous savez comment le faire?

+0

Would sed « s/([a-zA-Z] + [^ a-zA-Z] + [a-zA-Z] +) [^ a-zA-Z] +/$ 1 \ n/g ' le faire? Je n'ai pas de Linux à portée de main ... – chiccodoro

+0

@chiccodoro: En changeant le vôtre en 'sed -r ...' et le '$ 1' en' \ 1', il imprime deux mots par ligne, mais il ne répète pas les mots . –

Répondre

1

Pipe votre fichier Word à l'entrée standard de ce script.

#! bash 
last_word="" 
while read word 
do 
    if [ $last_word != "" ] ; then 
     echo $last_word $word 
    fi 
    last_word=$word 
done 
+0

Ce script n'est pas général. – crenate

0

Cela nécessite probablement GNU sed et il y a probablement une façon plus simple:

sed 's/[[:blank:]]*\<\(\w\+\)\>/\1 \1\n/g; s/[^ ]* \([^\n]*\)\n\([^ ]*\)/\1 \2\n/g; s/ \n//; s/\n[^ ]\+$//' inputfile 
1

Cela fonctionne aussi:

paste <(head -n -1 test.dat) <(tail +2 test.dat) 
0

à votre commande ajouter:

| awk '(PREV!="") {printf "%s %s\n", PREV, $1} {PREV=$1}' 
1

utilisation awk pour cela, pas besoin de rien autre

$ echo "My bike is fast and clean" | awk '{for(i=1;i<NF;i++){printf "%s %s\n",$i,$(i+1) } }' 
My bike 
bike is 
is fast 
fast and 
and clean 
+0

doux et simple :) – Vijay

Questions connexes