Unix - Besoin de couper un fichier qui a plusieurs espaces comme délimiteur - awk ou couper?
J'ai besoin d'obtenir les enregistrements à partir d'un fichier texte sous Unix. Le délimiteur est plusieurs espaces. Par exemple:
2U2133 1239
1290fsdsf 3234
À partir de cela, j'ai besoin d'extraire
1239
3234
Le délimiteur pour tous les enregistrements seront toujours 3 blancs.
J'ai besoin de faire un script unix(.scr) et écrire la sortie dans un autre fichier, ou l'utiliser comme entrée pour un do-while. J'ai essayé de le ci-dessous:
while read readline
do
read_int=`echo "$readline"`
cnt_exc=`grep "$read_int" ${Directory path}/file1.txt| wc -l`
if [ $cnt_exc -gt 0 ]
then
int_1=0
else
int_2=0
fi
done < awk -F' ' '{ print $2 }' ${Directoty path}/test_file.txt
test_file.txt est le fichier d'entrée et file1.txt est une recherche de fichier. Mais la façon décrite ci-dessus ne fonctionne pas et me donne des erreurs de syntaxe près de awk -F
J'ai essayé d'écrire le résultat dans un fichier. La suite travaillé dans la ligne de commande:
more test_file.txt | awk -F' ' '{ print $2 }' > output.txt
Cela fonctionne, et l'écriture des enregistrements de output.txt en ligne de commande. Mais la même commande ne fonctionne pas dans le script unix (C'est une .scr fichier)
S'il vous plaît laissez-moi savoir où je vais mal et comment je peux résoudre ce problème.
Merci,
Visakh
source d'informationauteur visakh
Vous devez vous connecter pour publier un commentaire.
Cela dépend de la version ou de la mise en œuvre de
cut
sur votre machine. Certaines versions de soutenir une option, généralement-i
qui signifie "ignorer les champs vides" ou, de manière équivalente, permettre à plusieurs séparateurs entre les champs. Si c'est pris en charge, utilisez:Si pas (et il n'est pas universel, et peut-être même pas très répandue, puisque ni GNU ni MacOS X ont la possibilité), puis à l'aide
awk
est mieux et plus portable.Vous avez besoin de rediriger la sortie de
awk
dans votre boucle, si:La seule résiduelle question est de savoir si la
while
boucle est dans un sous-shell et et donc de ne pas modifier votre principale scripts shell, variables, seulement sa propre copie de ces variables.Avec bash, vous pouvez utiliser processus de substitution:
Ce qui laisse la
while
boucle dans le shell courant, mais s'arrange pour la sortie de la commande à apparaître comme si à partir d'un fichier.Le vide dans
${Directory path}
n'est normalement pas légal sauf si c'est un autre Bash fonctionnalité que j'ai raté; vous avez aussi eu une faute de frappe (Directoty
) en un seul endroit.D'autres façons de faire la même chose côté, l'erreur dans votre programme: Vous ne pouvez pas rediriger (
<
) la sortie d'un autre programme. Transformez votre script et utiliser un tuyau comme ceci:etc.
En outre, l'utilisation de "readline" comme un nom de variable peut ou ne peut pas vous amener des problèmes.
Dans ce cas particulier, vous pouvez utiliser la ligne suivante
pour obtenir votre deuxième colonnes.
En bash, vous pouvez commencer avec quelque chose comme ceci:
Il ne fonctionne pas dans le script en raison de la faute de frappe dans "Directo*t*y chemin" (dernière ligne de votre script).
Coupe n'est pas assez flexible. J'ai l'habitude d'utiliser Perl pour que:
Au lieu d'un triple espace après -F vous pouvez mettre n'importe quelle expression régulière Perl. Vous accédez à des domaines aussi $F[n]où n est le numéro du champ (le comptage commence à zéro). De cette façon, il n'y a pas besoin de sed ou tr.