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
3 Réponses :
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
@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'
, 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.
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
Merci mais le fichier est trop gros.
@dani si les fichiers sont individuels, utilisez la nouvelle solution.
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
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
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 commeawk '{printf "% 15s \ t% s \ n", $ 1, $ 2}'
entre les deux. Bonne chance.