Ok, puisque c'est une question complexe, je vais l'expliquer clairement. J'ai obtenu un contenu de fichier comme indiqué ci-dessous:
$ Cat File1
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}
La sortie que je veux
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD +POP ;
Tout d'abord, j'essaie de retirer la dernière colonne de la File1
et de l'imprimer par
sed 's/[{}//g' File1 > File3
Après cela, je copie tout le contenu d' File1
un nouveauFile4
cp File1 File4
Après cela, je remplace les données à l'intérieur du File4
par les File3
données (signifie les données sans parenthèse une " File1
dernière colonne celle-là")
awk 'FNR==NR{a[NR]=$1;next}{$5=a[FNR]}1' File3 File4 >>File5
La sortie devrait être comme ceci
ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP TBMKF
ABC Cool Lol POP YUKER
ABC Cool Lol POP EFEFVD
Enfin, j'essaye
awk -F“ " '{print - $2,$5 +,$4 ";"}‘ File5
Mais le résultat n'est pas sorti comme indiqué comme je le souhaite, seules les données similaires MNB sont toutes répertoriées, d'autres ne sont pas apparues (fichier une dernière colonne de données),
text-processing
awk
heng960407
la source
la source
awk --version
, quel est le résultat?Réponses:
Je ne sais pas pourquoi vous copiez les choses à gauche et à droite. La chose simple est
J'ai mis le
-
au début et;
à la fin.Entre les deux, nous imprimons
$2
parce que nous le voulons tel quel.$5
, qui est la chaîne sans le premier et le dernier caractère. Nous sautons le premier caractère en commençant à la position 2 (awk a toujours été étrange à ce sujet) et omettons le dernier caractère en sélectionnant uniquement une sous-chaîne qui est deux caractères plus courte que l'original$5
+
parce que nous voulons$4
Cependant, je ne sais pas si toutes ces fonctions de chaîne sont spécifiques à GNU awk.
la source
substr(string, 2)
retourne la sous - chaîne à partir du second caractère, commecut -c2-
,tail -n +2
,sed '2,$'
... Ce qui est si étrange à ce sujet?awk
des années 70.Avec sed
Et la variation awk
la source
Travail TXR facile :
Utilisation de la macro awk TXR Lisp pour translittérer la solution Awk:
Les champs sont dans la
f
liste et l'indexation est basée sur zéro.la source
L'utilisation de awk est plus simple lorsque les
$1,$2,...
champs contiennent déjà les chaînes exactes avec lesquelles vous souhaitez travailler. Le séparateur de champ, s'il contient plusieurs caractères, est interprété comme une expression régulière. Nous n'avons pas besoin de faire d'opérations de recherche et de remplacement ou de sous-chaîne pour se débarrasser des {accolades}. Nous les comptons simplement comme faisant partie du délimiteur.Utiliser
printf
au lieu deprint
rend également un peu plus facile de voir comment la chaîne sera formatée, mais si vous voulez avoir à laprint "-"$2,$5" + "$4";"
place deprintf("-%s %s + %s ;\n", $2, $5, $4)
, c'est une option.la source