Comment ajouter tout de suite l'en-tête et la fin au fichier existant

0

Existe-t-il un moyen simple d’ajouter un en-tête et une fin à un fichier texte existant? Même répertoire même fichier texte. Par exemple le awk?
Appréciez l’aide fournie pour expliquer comment la traiter awk. Merci.

Parce que ce que je sais consiste en quelques étapes. S'il vous plaît se référer à ci-dessous:

Supposons que je veuille ajouter un en-tête à fin de fichier dans un fichier existant ALERT.txt.
Le fichier se trouve dans le répertoire appelé$Source_Dir

Le fichier texte contient le nom de la colonne, donc j’ai deux variables Record_Countet Actual_Record_Countcompter l’enregistrement:

Record_Count=`wc -l < ${Source_Dir}/${Output_File_Name} | tr -d " "`
Actual_Record_Count=`expr ${Record_Count} - 1`

Tout d'abord, je crée un fichier texte appelé ALERTavec l'en-tête$Target_Dir

echo ${Bus_date} >${Target_Dir}/${Output_File_Name}

Ensuite, j’ajoute le Alert.txtde $Source_Dirau nouveau fichier créé dans$Target_Dir

cat ${Source_Dir}/${Output_File_Name} >> ${Target_Dir}/${Output_File_Name}

Enfin, je continue d’ajouter la bande-annonce au fichier Alert.txtdans $Target_Dir.
La bande-annonce contient le nombre d'enregistrements

echo "EOF${Actual_Record_Count}" >>${Target_Dir}/${Output_File_Name}
Juliet.Y
la source
4
printf '%s\n%s\n%s\n' "HEADER" "$(<alert.txt)" "FOOTER" >alert.txt.tmp && mv alert.txt.tmp alert.txt?
Heemayl
2
{ echo "HEADER"; cat alert.txt; echo "FOOTER"; } > tmp && mv tmp alert.txt
1
Votre instinct d’utilisation awkme semble bon: vous pouvez probablement éviter le wc -lproblème et utiliser simplement le nombre d’enregistrements de awk NRdans un ENDbloc, par exemple awk -v bus_date="${BUS_DATE}" 'BEGIN{print bus_date} {print} END{printf "EOF%d\n", NR}' file. S'il BUS_DATEne s'agit en réalité que d'un horodatage, vous pourrez peut-être également le générer en interne (du moins avec GNU awk).
Steeldriver
1
J'utiliserais probablement ed (1) pour éviter le fichier temporaire, mais la solution de @RakeshSharma est également correcte (heemay! A une surcharge énorme pour les fichiers plus volumineux).
mirabilos

Réponses:

0

Donc, vous avez une variable shell, $Bus_dateque vous voulez ajouter sur une ligne par elle-même comme en-tête. Ensuite, il devrait suivre le contenu de $Source_Dir/$Output_File_Name, suivi de la chaîne EOFNNNNest le nombre de lignes dans ce fichier moins un.

Utilisant awk:

awk -v head="$Bus_date" 'BEGIN { print head } { print } END { print "EOF" NR-1 }' "$Source_Dir/$Output_File_Name" >"$Target_Dir/$Output_File_Name"

Le script est:

BEGIN { print head }
      { print }
END   { print "EOF" NR-1 }

Sur la ligne de commande, nous définissons la awkvariable headsur la valeur de $Bus_date. Cette valeur est sortie avant que nous commencions à lire le fichier donné, par le BEGINbloc.

Le { print }bloc veille à ce que le fichier donné soit transmis tel quel, sans modification.

Le ENDbloc utilise la variable intégrée NRqui contient le nombre d'enregistrements (lignes) lus jusqu'à présent. Dans le ENDbloc, NRsera le nombre de lignes dans le fichier qui a été lu.

Kusalananda
la source