web-dev-qa-db-fra.com

Comment puis-je ajouter une ligne à un fichier dans un script Shell?

Je souhaite ajouter une ligne d'en-têtes à un fichier CSV existant, en modifiant sur place. Comment puis-je faire ceci?

echo 'one, two, three' > testfile.csv

et je veux finir avec

column1, column2, column3
one,     two,     three

Changer la sortie CSV initiale est hors de ma portée.

N'importe quelle commande standard fera l'affaire. L'important est que le fichier soit édité sur place et que la ligne soit insérée au début du fichier.

41
user4812

Cela ajoute du texte personnalisé au début de votre fichier:

echo 'your_custom_escaped_content' > temp_file.csv
cat testfile.csv >> temp_file.csv
mv temp_file.csv testfile.csv
33
tunnuz

Pour répondre à votre question initiale, voici comment procéder avec sed:

sed -i '1icolumn1, column2, column3' testfile.csv

La commande "1i" indique à sed d'aller à la ligne 1 et d'y insérer le texte.

L'option -i entraîne la modification du fichier "sur place" et peut également prendre un argument facultatif pour créer un fichier de sauvegarde, par exemple

sed -i~ '1icolumn1, column2, column3' testfile.csv

conserverait le fichier d'origine dans "testfile.csv ~".

69
Matthew Crumley

Cela n'utilise pas sed, mais l'utilisation de >> s'ajoutera à un fichier. Par exemple:

echo 'one, two, three' >> testfile.csv

Modifier : pour ajouter un préfixe à un fichier, essayez quelque chose comme ceci:

echo "text"|cat - yourfile > /tmp/out && mv /tmp/out yourfile

Je l'ai trouvé grâce à un rapide recherche Google .

11
Scottie T

Si je comprends bien, vous souhaitez ajouter column1, column2, column3 À votre one, two, three Existant.

J'utiliserais ed à la place de sed, puisque sed écrit sur la sortie standard et non dans le fichier.

La commande:

printf '0a\ncolumn1, column2, column3\n.\nw\n' | ed testfile.csv

devrait faire le travail.

Perl -i Vaut également le coup d'œil.

8
mouviciel

sed est basé sur la ligne, donc je ne sais pas pourquoi vous voulez faire ça avec sed. Le paradigme consiste plus à traiter une ligne à la fois (vous pouvez également trouver par programmation le nombre de champs dans le CSV et générer votre ligne d'en-tête avec awk) Pourquoi pas seulement

echo "c1, c2, ... " >> file
cat testfile.csv >> file

?

3
Steve B.

Ajoutez une ligne donnée au début d'un fichier dans deux commandes:

cat <(echo "blablabla") input_file.txt > tmp_file.txt
mv tmp_file.txt input_file.txt
1
tflutre

Utilisez Perl -i, avec une commande qui remplace le début de la ligne 1 par ce que vous souhaitez insérer (le .bk aura pour effet que votre fichier d'origine est sauvegardé):

Perl -i.bk -pe 's/^/column1, column2, column3\n/ if($.==1)' testfile.csv  
1
Markus