2 votes

Comment aligner le fichier texte après un copier-coller ?

J'ai copié les colonnes 7,8 et 9 du fichier 1 dans les colonnes 7,8 et 9 du fichier 2, ce qui a produit un nouveau fichier 3. Le fichier produit (fichier 3) n'est pas aligné comme les fichiers originaux, comment puis-je le modifier pour préserver l'alignement ?

J'ai utilisé la commande :

    awk '(getline line < "file 1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file 2 > file 3

fichier 1 :

GRM dans le vide

192700

1GRM     C1    1  17.188   0.311  13.994 -0.5971  0.0204 -0.0724
1GRM     C2    2   0.094   0.383   0.005  0.4831 -0.8709 -0.2204
1GRM     C3    3   0.091   0.524   0.008 -0.7098  0.3449 -0.3952
1GRM     C4    4  17.185   0.596   0.007 -0.4066 -0.4079  0.1701
2GRM     C1    5  17.187   0.738   0.016  0.1844 -0.5441 -0.4893
2GRM     C2    6   0.090   0.815   0.011  1.1631 -0.2289 -0.8340
2GRM     C3    7   0.091   0.957   0.014 -0.4473 -0.2423 -0.3223
2GRM     C4    8  17.184   1.028   0.009 -0.4822  0.0086 -0.4791
3GRM     C1    9  17.189   1.171   0.004 -0.0345 -0.8207 -0.6602 

fichier 2 :

GRM dans le vide

192760

1GRM     C1    1   0.061   0.071  14.000 
1GRM     C2    2   0.184   0.142  14.000
1GRM     C3    3   0.184   0.284   0.000
1GRM     C4    4   0.061   0.355   0.000
2GRM     C1    5   0.061   0.497  14.000
2GRM     C2    6   0.184   0.568   0.000
2GRM     C3    7   0.184   0.710   0.000
2GRM     C4    8   0.061   0.781   0.000
3GRM     C1    9   0.061   0.923   0.000
3GRM     C2   10   0.184   0.994  14.000
3GRM     C3   11   0.184   1.136  14.000
3GRM     C4   12   0.061   1.207  14.000
4GRM     C1   13   0.061   1.349  14.000
4GRM     C2   14   0.184   1.420  14.000
4GRM     C3   15   0.184   1.562   0.000
4GRM     C4   16   0.061   1.633  14.000
5GRM     C1   17   0.061   1.775   0.000
5GRM     C2   18   0.184   1.846   0.002
5GRM     C3   19   0.184   1.988   0.001
5GRM     C4   20   0.061   2.059   0.000

fichier 3 :

GRM dans le vide

192760

1GRM C1 1 0.061 0.071 14.000 -0.5971 0.0204 -0.0724
1GRM C2 2 0.184 0.142 14.000 0.4831 -0.8709 -0.2204
1GRM C3 3 0.184 0.284 0.000 -0.7098 0.3449 -0.3952
1GRM C4 4 0.061 0.355 0.000 -0.4066 -0.4079 0.1701
2GRM C1 5 0.061 0.497 14.000 0.1844 -0.5441 -0.4893
2GRM C2 6 0.184 0.568 0.000 1.1631 -0.2289 -0.8340
2GRM C3 7 0.184 0.710 0.000 -0.4473 -0.2423 -0.3223
2GRM C4 8 0.061 0.781 0.000 -0.4822 0.0086 -0.4791
3GRM C1 9 0.061 0.923 0.000 -0.0345 -0.8207 -0.6602
3GRM C2 10 0.184 0.994 14.000 0.1033 0.4238 -0.8983
3GRM C3 11 0.184 1.136 14.000 -0.0426 -0.1083 -0.8554
3GRM C4 12 0.061 1.207 14.000 -0.2814 -0.0363 -0.9146
4GRM C1 13 0.061 1.349 14.000 0.7722 0.4317 -0.4379
4GRM C2 14 0.184 1.420 14.000 -0.5701 0.2915 -0.3098
4GRM C3 15 0.184 1.562 0.000 0.4572 0.1368 0.1921
4GRM C4 16 0.061 1.633 14.000 -0.0747 -0.5492 -0.1254
5GRM C1 17 0.061 1.775 0.000 0.3071 0.9864 -0.8679
5GRM C2 18 0.184 1.846 0.002 -0.7815 -0.8144 -0.0069
5GRM C3 19 0.184 1.988 0.001 -0.0089 0.1174 0.2548
5GRM C4 20 0.061 2.059 0.000 0.7953 0.1404 -1.1225
6GRM C1 21 0.061 2.201 14.000 -0.0370 0.1705 -0.3342
6GRM C2 22 0.184 2.272 14.000 -0.2619 0.4221 -0.6572
6GRM C3 23 0.184 2.414 14.000 -0.4540 -0.3948 -0.6204
6GRM C4 24 0.061 2.485 14.000 -0.1499 -0.2942 -0.5181

le format que je souhaite obtenir est le même que celui des fichiers 1 et 2 (espaces entre les colonnes)

J'ai essayé les commandes ci-dessous comme conseillé par schrodigerscatcuriosity et steeldriver, cependant j'ai toujours un problème de la ligne 10002 à la fin, veuillez vérifier ci-dessous les commandes que j'ai essayées et la sortie :

    awk '(getline line < "file_1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file_2 | rev | column -t | rev > file_3

    awk 'BEGIN{fmt="%8s%7s%5d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} (getline line < "file 1") > -1 {n = split(line,a)} n > 6 {$0 = sprintf(fmt,$1,$2,$3,$4,$5,$6,a[7],a[8],a[9])} 1' "file 2" > file 3

Les deux m'ont donné la réponse suivante :

 2499GRM     C2 9994  15.433   7.810   0.001  0.2740 -0.1307  0.2597
 2499GRM     C3 9995  15.433   7.952   0.000 -0.0604 -0.1317  0.2130
 2499GRM     C4 9996  15.310   8.023   0.001 -0.0362 -0.0640 -0.3092
 2500GRM     C1 9997  15.310   8.165   0.001 -0.0183 -0.0765 -0.0458
 2500GRM     C2 9998  15.433   8.236   0.000 -0.2414  0.3310  0.3241
 2500GRM     C3 9999  15.433   8.378   0.000 -0.2669  0.3179  0.8367
 2500GRMC410000   15   8.449   0.000   0.000  0.5860  0.8426  0.0000 #(This line is 10002)
 2501GRMC110001   15   8.591   0.000   0.000  0.5939 -0.1623  0.0000
 2501GRMC210002   15   8.662   0.000   0.000  0.4561 -0.1660  0.0000

J'ai essayé d'augmenter les espaces en utilisant

 awk 'BEGIN{fmt="%10s%9s%7d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} (getline line < "file 1") > -1 {n = split(line,a)} n > 6 {$0 = sprintf(fmt,$1,$2,$3,$4,$5,$6,a[7],a[8],a[9])} 1' "file 2" > file 3

comme conseillé par , et j'ai obtenu le résultat suivant :

   2499GRM       C3   9995  15.433   7.952   0.000 -0.0604 -0.1317  0.2130
   2499GRM       C4   9996  15.310   8.023   0.001 -0.0362 -0.0640 -0.3092
   2500GRM       C1   9997  15.310   8.165   0.001 -0.0183 -0.0765 -0.0458
   2500GRM       C2   9998  15.433   8.236   0.000 -0.2414  0.3310  0.3241
   2500GRM       C3   9999  15.433   8.378   0.000 -0.2669  0.3179  0.8367
   2500GRM  C410000     15   8.449   0.000   0.000  0.5860  0.8426  0.0000 # (This line is 10002)
   2501GRM  C110001     15   8.591   0.000   0.000  0.5939 -0.1623  0.0000
   2501GRM  C210002     15   8.662   0.000   0.000  0.4561 -0.1660  0.0000
   2501GRM  C310003     15   8.804   0.000   0.000  0.4524 -0.1486  0.0000
   2501GRM  C410004     15   8.875   0.000   0.000 -0.2143  0.4926  0.0000
   2502GRM  C110005     15   9.017   0.000   0.000 -0.2203  0.2975  0.0000
   2502GRM  C210006     15   9.088   0.000   0.000 -0.2375 -0.0458  0.0000
   2502GRM  C310007     15   9.230  14.000   0.000 -0.2338 -0.4862  0.0000
   2502GRM  C410008     15   9.301  14.000   0.000 -0.1438 -0.0725  0.0000

Le fichier original se présente comme suit à la même partie (à la ligne 10002) :

fichier 1 :

 2499GRM     C3 9995  15.167   8.231  13.994 -0.0604 -0.1317  0.2130
 2499GRM     C4 9996  15.045   8.304  13.996 -0.0362 -0.0640 -0.3092
 2500GRM     C1 9997  15.046   8.446   0.001 -0.0183 -0.0765 -0.0458
 2500GRM     C2 9998  15.170   8.516  13.999 -0.2414  0.3310  0.3241
 2500GRM     C3 9999  15.172   8.658   0.003 -0.2669  0.3179  0.8367
 2500GRM     C410000  15.049   8.727   0.006 -0.1138  0.5860  0.8426 #(line 10002)
 2501GRM     C110001  15.048   8.869   0.006 -0.0660  0.5939 -0.1623
 2501GRM     C210002  15.171   8.940   0.006  0.0179  0.4561 -0.1660
 2501GRM     C310003  15.173   9.082   0.005  0.3025  0.4524 -0.1486

fichier 2 :

 2499GRM     C3 9995  15.433   7.952   0.000
 2499GRM     C4 9996  15.310   8.023   0.001
 2500GRM     C1 9997  15.310   8.165   0.001
 2500GRM     C2 9998  15.433   8.236   0.000
 2500GRM     C3 9999  15.433   8.378   0.000
 2500GRM     C410000  15.310   8.449   0.000     #(This line is 10002)
 2501GRM     C110001  15.310   8.591   0.000
 2501GRM     C210002  15.433   8.662   0.000
 2501GRM     C310003  15.433   8.804   0.000
 2501GRM     C410004  15.310   8.875   0.000

Il convient de mentionner que le problème se produit à la ligne 10002

2voto

Vous pouvez essayer cette astuce :

awk '(getline line < "file_1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file_2 | rev | column -t | rev > file_3

Ausgabe:

1GRM  C1   1  0.061  0.071  14.000  -0.5971   0.0204  -0.0724
1GRM  C2   2  0.184  0.142  14.000   0.4831  -0.8709  -0.2204
1GRM  C3   3  0.184  0.284   0.000  -0.7098   0.3449  -0.3952
1GRM  C4   4  0.061  0.355   0.000  -0.4066  -0.4079   0.1701
2GRM  C1   5  0.061  0.497  14.000   0.1844  -0.5441  -0.4893
2GRM  C2   6  0.184  0.568   0.000   1.1631  -0.2289  -0.8340
2GRM  C3   7  0.184  0.710   0.000  -0.4473  -0.2423  -0.3223
2GRM  C4   8  0.061  0.781   0.000  -0.4822   0.0086  -0.4791
3GRM  C1   9  0.061  0.923   0.000  -0.0345  -0.8207  -0.6602
3GRM  C2  10  0.184  0.994  14.000  -0.0345  -0.8207  -0.6602
3GRM  C3  11  0.184  1.136  14.000  -0.0345  -0.8207  -0.6602
3GRM  C4  12  0.061  1.207  14.000  -0.0345  -0.8207  -0.6602
4GRM  C1  13  0.061  1.349  14.000  -0.0345  -0.8207  -0.6602
4GRM  C2  14  0.184  1.420  14.000  -0.0345  -0.8207  -0.6602
4GRM  C3  15  0.184  1.562   0.000  -0.0345  -0.8207  -0.6602
4GRM  C4  16  0.061  1.633  14.000  -0.0345  -0.8207  -0.6602
5GRM  C1  17  0.061  1.775   0.000  -0.0345  -0.8207  -0.6602
5GRM  C2  18  0.184  1.846   0.002  -0.0345  -0.8207  -0.6602
5GRM  C3  19  0.184  1.988   0.001  -0.0345  -0.8207  -0.6602
5GRM  C4  20  0.061  2.059   0.000  -0.0345  -0.8207  -0.6602

2voto

steeldriver Points 118154

Si vous avez besoin d'un alignement strict, vous pouvez envisager d'utiliser un format explicite de printf o sprintf déclaration ex.

$ awk '
    BEGIN{fmt="%8s%7s%5d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} 
    (getline line < "file 1") > -1 {n = split(line,a)} 
    n > 6 {$0 = sprintf(fmt, $1,$2,$3,$4,$5,$6,a[7],a[8],a[9])}
    1
  ' "file 2"
GRM in vacuum

192760

    1GRM     C1    1   0.061   0.071  14.000 -0.5971  0.0204 -0.0724
    1GRM     C2    2   0.184   0.142  14.000  0.4831 -0.8709 -0.2204
    1GRM     C3    3   0.184   0.284   0.000 -0.7098  0.3449 -0.3952
    1GRM     C4    4   0.061   0.355   0.000 -0.4066 -0.4079  0.1701
    2GRM     C1    5   0.061   0.497  14.000  0.1844 -0.5441 -0.4893
    2GRM     C2    6   0.184   0.568   0.000  1.1631 -0.2289 -0.8340
    2GRM     C3    7   0.184   0.710   0.000 -0.4473 -0.2423 -0.3223
    2GRM     C4    8   0.061   0.781   0.000 -0.4822  0.0086 -0.4791
    3GRM     C1    9   0.061   0.923   0.000 -0.0345 -0.8207 -0.6602
    3GRM     C2   10   0.184   0.994  14.000 -0.0345 -0.8207 -0.6602
    3GRM     C3   11   0.184   1.136  14.000 -0.0345 -0.8207 -0.6602
    3GRM     C4   12   0.061   1.207  14.000 -0.0345 -0.8207 -0.6602
    4GRM     C1   13   0.061   1.349  14.000 -0.0345 -0.8207 -0.6602
    4GRM     C2   14   0.184   1.420  14.000 -0.0345 -0.8207 -0.6602
    4GRM     C3   15   0.184   1.562   0.000 -0.0345 -0.8207 -0.6602
    4GRM     C4   16   0.061   1.633  14.000 -0.0345 -0.8207 -0.6602
    5GRM     C1   17   0.061   1.775   0.000 -0.0345 -0.8207 -0.6602
    5GRM     C2   18   0.184   1.846   0.002 -0.0345 -0.8207 -0.6602
    5GRM     C3   19   0.184   1.988   0.001 -0.0345 -0.8207 -0.6602
    5GRM     C4   20   0.061   2.059   0.000 -0.0345 -0.8207 -0.6602

2voto

Raffa Points 11919

En plus des deux excellentes réponses déjà données par conducteur d'acier y schrodigerscatcuriosité

Essayez ceci (il s'agit d'une commande divisée en quatre lignes pour plus de lisibilité, il suffit de copier les quatre lignes en une seule fois puis de les coller dans le terminal et d'appuyer sur Enter ) et voyez si cela vous convient :

awk '(getline line < "file1") > -1 {split(line,a); l=length($2); \
if (l>2) {$2=substr($2,1,2) OFS substr($2,3)}; \
if (l>2) {$7 = a[6]; $8 = a[7]; $9= a[8]} else \
{$7 = a[7]; $8 = a[8]; $9= a[9]}}1' "file2" | column -t > "file3"

Changer file1 y file2 à vos fichiers d'entrée et la sortie sera sauvegardée dans le fichier file3


Avis :

Le nombre de colonnes change à la ligne 10002 (les colonnes 2 et 3 deviennent une seule colonne) et la partie suivante de la commande corrige ce problème :

l=length($2); \
if (l>2) {$2=substr($2,1,2) OFS substr($2,3)}; \
if (l>2) {$7 = a[6]; $8 = a[7]; $9= a[8]} else \
{$7 = a[7]; $8 = a[8]; $9= a[9]}

0voto

Seb Points 1760

La réponse à cette question a été donnée dans Stack Exchange - Unix & Linux par Freddy. Je poste juste la réponse au cas où quelqu'un d'autre aurait le même problème.

Le problème est que vous avez 8 ou 9 champs de données dans le fichier 1 et 5 ou 6 dans le fichier 2. Soit C3 9999 est un champ mal formaté, soit C410000 devrait être deux champs C4 et 10000.

Pour ajuster le formatage en fonction du nombre de champs, vous pouvez

utiliser deux chaînes de format et passer de l'une à l'autre enregistrer le nombre d'éléments du tableau n lorsque vous divisez la ligne et prenez les trois dernières valeurs a[n-2], a[n-1], a[n].

awk '
BEGIN{
fmt1="%8s %6s%5s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
fmt2="%8s %11s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
}
(getline line < "file 1") > -1{
n=split(line, a)
}
NF<=3{ print; next }                                                     # 
print original line 
NF==6{ printf fmt1, $1, $2, $3, $4, $5, $6, a[n-2], a[n-1], a[n]; next } # 6 + 
3 fields
{ printf fmt2, $1, $2, $3, $4, $5, a[n-2], a[n-1], a[n] }                # 5 + 
3 fields
' "file 2" > "file 3"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X