Script Bash[4] — $i + awk

Let’s suppose you want to print the name of the file in front of the lines of this file:
File toto:

blalbla
blibli

=>

toto blabla
toto blibli

I know, it’s a very good example, thanks…;)
You want to do this for all the files in your folder.

for f in *; do cat $f | awk ‘{ $f, $0}’ >$f.new ; done

This code won’t work because $f will be interpreted by awk, not by bash

for f in *; do cat $f | awk “{ \”$f\”, \$0}” >$f.new ; done

is much better, isn’t it ?

For myself: replace in all the .txt files (recursively) lose by win:

find . -name ‘*.txt’ -type f -exec sed -i ‘s/lose/win/g’ \{\} \;

for non recursive:

find . -maxdepth 1 -name ‘*.txt’ -type f -exec sed -i ‘s/lose/win/g’ \{\} \;

Supposez que l’on veuille mettre le nom du fichier devant chaque ligne de ce fichier :
Fichier toto :

blalbla
blibli

=>

toto blabla
toto blibli

Je sais, c’est un super exemple, merci ;)
On veut faire ça pour tous les fichiers du répertoire.

for f in *; do cat $f | awk ‘{ $f, $0}’ >$f.new ; done

Ce code ne marche pas à cause de $f qui est interprété par awk, et non par bash

for f in *; do cat $f | awk “{ \”$f\”, \$0}” >$f.new ; done

est bien mieux, non ?

Pour moi-même : remplacez dans tous les fichiers .txt (recursivement) perdu par gagne :

find . -name ‘*.txt’ -type f -exec sed -i ‘s/perdu/gagne/g’ \{\} \;

Pour du non récursif :

find . -maxdepth 1 -name ‘*.txt’ -type f -exec sed -i ‘s/perdu/gagne/g’ \{\} \;

~ by loquehumaine on 2008, January 22 - Tuesday.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: