J'ai un fichier d'entrée FILE1.TXT comme ci-dessous.
11 id1
12
13 AGE = 20
14 NAME = NAME1
15
16 id2
17
18 AGE = 30
19 NAME = NAME2
.
.
.
110 idXYZ
111
112 AGE = AGEXYZ
113 NAME = NAMEXYZ
114
115 idZZZ
116
Je souhaite rechercher tous les champs qui appartiennent à un identifiant particulier et obtenir la valeur de NAME
J'ai réussi à parcourir chaque identifiant et à former la commande ci-dessous pour chaque identifiant selon les besoins.
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'
Le problème ici est que j'obtiens la sortie NAME1 , en plus de cela, j'obtiens également NAMEXYZ .
Que faut-il changer pour ne recevoir que NAME1 mais pas NAMEXYZ ?
Comme solution de contournement, les commandes ci-dessous fonctionnent.
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'|head -1
Y a-t-il un «commutateur» ou est-ce que je manque quelque chose?
^(random no of spaces)11
?sed -n '/^\s*11 /,/^\s*14 /p'
sed -n '/^11 /,/^14 /p' | awk '/NAME/{print $NF}'
avez-vous essayé cela?Utilisez les limites des mots:
correspondrait
NAME1
et nonNAME1XYZ
ouXYZNAME1
.De même,
ne correspondrait pas aux lignes contenant
111
et142
.EDIT: Il semble que les numéros du fichier d'entrée soient en fait des numéros de ligne. Si tel est le cas, vous pouvez simplement dire:
pour obtenir les lignes souhaitées.
la source
NAME
entre les lignes 11 et 14. Alors, pourquoised
regarde111
-114
t-on et ? Comment faire pour qu'il ne regarde pas entre111
et114
?sed
expression.grep
avec-w
indicateur? n'est-ce pas?-w
serait équivalent. Pour l'sed
exemple,-w
est légèrement différent.Vous pouvez utiliser AWK
Cela recherchera les lignes entre 13 et 17 puis recherchera le nom et s'il correspond, il imprimera le dernier mot de
Name = LastWord
la source
$
avantNR
et cela a causé l'erreur.Vous n'avez besoin d'aucun autre outil pour cela, vous
sed
pourrez facilement le gérer en entier.Cela ne devrait vous fournir que la première séquence de caractères non blancs suivant la phrase "NAME =" pour chaque ligne sur laquelle cette phrase se trouve entre les lignes 11 et 14 de tout fichier d'entrée
sed
est alimenté.la source
sed n'est pas le bon outil pour ce travail. Utilisez awk où vous pouvez spécifier l'ID que vous recherchez et imprimer le prochain NOM qui apparaît.
la source
version générique non basée sur le numéro de ligne mais la référence de l'id
la source
vous pouvez imprimer les lignes qui contiennent le motif correspondant en utilisant sed comme suit:
-n
- ces options désactivent cette impression automatique, et sed ne produit de sortie que lorsque cela est explicitement demandé via lap
commande.p
- impressionla source