2
votes

copiez tout le texte du fichier texte et insérez-le au début de chaque ligne sed

Je veux copier tout le texte dans un fichier texte et ajouter au début de chaque ligne dans un autre fichier texte.

J'ai essayé avec sed, je peux mettre un caractère au début de chaque ligne mais je je ne sais pas comment copier du texte à partir d'un autre fichier

J'ai essayé ceci:

u              u  = explanation here
ubbia          ubbia = explanation here
ubbidiente     ubbidiente = explanation here
ubbidienza     ubbidienza = explanation here
ubbidire       ubbidire = explanation here
ubertoso       ubertoso = explanation here

mais cela ne met qu'un caractère ou une chaîne. p >

Exemple:

J'ai dans le 2.txt les mots:

u  = explanation here
ubbia = explanation here
ubbidiente = explanation here
ubbidienza = explanation here
ubbidire = explanation here
ubertoso = explanation here

dans le second 3.txt J'ai les mêmes lignes mais avec explication:

u
ubbia
ubbidiente
ubbidienza
ubbidire
ubertoso

Je veux ce résultat:

sed 's/^/#/' 2.txt > 3.txt


1 commentaires

paste 2.txt 3.txt> shared.txt peut fonctionner pour vous. Il comprendra un seul caractère de tabulation sur chaque ligne entre les différents contenus. Si vous en avez vraiment besoin parfaitement aligné, vous pouvez ajouter quelque chose comme awk '{printf "% 15s \ t% s \ n", $ 1, $ 2}' entre les deux. Bonne chance.


3 Réponses :


1
votes

Pourriez-vous s'il vous plaît essayer ci-dessous, cette solution fera une indentation dans la sortie selon la longueur de la longueur maximale de la 1ère colonne (une logique a été écrite pour cela), testée avec des échantillons donnés.

u                   u  = explanation here
ubbia               ubbia = explanation here
ubbidiente          ubbidiente = explanation here
ubbidienza          ubbidienza = explanation here
ubbidire            ubbidire = explanation here
ubertoso            ubertoso = explanation here

La sortie sera la suivante.

awk '
FNR==NR{
  a[FNR]=$1
  c[$1]
  next
}
($1 in c){
  b[++count]=$0
  len=len>length($1)?len:length($1)
}
END{
  for(i=1;i<=count;i++){
    val=len<length(b[i])?len+(len-length(a[i])):len
    printf("%s%"val"s%s\n",a[i],OFS,b[i])
  }
}
'  2.txt 3.txt


7 commentaires

@dani, cela a bien fonctionné pour moi, pouvez-vous vérifier une fois si vous avez le caractère de contrôle M en faisant cat -v Input_file ?


Oui. J'ai le caractère M. Avec le paste 2.txt 3.txt> shared.txt posté par shellter a bien fonctionné pour moi


@dani, veuillez les supprimer en faisant tr -d '\ r' temp && mv temp Input_file , puis essayez mon code.


Je l'ai essayé. Fonctionne maintenant mais pas bien. Je trouve dans le texte les mots mais les mots ne correspondent pas aux autres mots du fichier d'entrée.


@dani, voir mon message J'obtiens une sortie correcte, comment l'obtenir?


J'obtiens la même indentation, mais mon fichier contient 27000 lignes et je n'obtiens pas le bon ordre avec votre code. J'obtiens ceci: ubbidiente ubbia = explication ici.


J'ai testé avec vos échantillons fournis. Je verrai où je pourrais l'ajuster davantage.



0
votes

Cela pourrait fonctionner pour vous (GNU sed):

parallel -k 'printf "%-15s%s\n" {1} {2}' ::::+ file1 file2

Ceci construit un script sed à partir de fichier1 et l'exécute sur fichier2. Si une ligne de fichier1 correspond au premier mot de fichier2, la ligne formatée printf du fichier 1 est ajoutée au début de la ligne correspondante de fichier2, sinon elle est supprimée. Si vous préférez laisser les lignes sans correspondance de file2 seules, supprimez les commandes -e 't; d' de la solution ci-dessus.

N.B. Cette solution ne nécessite aucun tri des fichiers, mais pour les fichiers volumineux, cela peut prendre beaucoup de temps.

De vos commentaires à jas, si le fichier est 1-1, cela peut fonctionner pour vous: p>

sed -E 's/.*/printf "%-15s" &/e;s#(\S+).*#s/^\\<\1\\>/&\1/#' file1 | 
sed -f - -e 't;d' file2


2 commentaires

Merci mais le fichier est trop gros.


@dani si les fichiers sont individuels, utilisez la nouvelle solution.



0
votes

Pourquoi avez-vous besoin du premier fichier? Pourquoi pas simplement:

$ awk '{print $1 "\t" $0}' 3.txt  | column -t -s $'\t'
u           u  = explanation here
ubbia       ubbia = explanation here
ubbidiente  ubbidiente = explanation here
ubbidienza  ubbidienza = explanation here
ubbidire    ubbidire = explanation here
ubertoso    ubertoso = explanation here


1 commentaires

Désolé, c'est de ma faute. J'ai ubbia le premier monde dans le premier fichier, puis ùbbia = explication ici dans le deuxième fichier. Je ne peux pas simplement le copier, il copiera aussi la lettre accentuée. Merci d'avoir répondu