2015-03-31 4 views
0

Я хочу использовать AWK всех файлов у меня есть в папке, делая это:AWK сценария на все файлы в папке

awk '{print $1"\t"$2"\t"$3"\tMPC/K4me1"$4"\t"$5"\t"$6}' GSM*.bed > tmp $$ mv tmp GSM*.bed 

ли я столкнуться с некоторыми ненормальности? Будет ли он делать все файлы в таком порядке, что tmp будет действительно уникальным для каждого файла и не будет перекрытий?

Я также получаю сообщение об ошибке от awk, когда я использую его:

awk: can't open file 12404 
input record number 21077683, file 12404 
source line number 1 

я делаю что-то не так?

ответ

0

Ваш текущий код будет расширять выражение GSM*.bed на что-то вроде:

awk '...' GSM1.bed GSM2.bed ... > tmp $$ mv tmp GSM1.bed GSM2.bed 

, который не имеет особого смысла. Вы можете использовать FILENAME в awk и т. Д., Чтобы обрабатывать файлы, но это похоже на сложность.

Это может быть лучше перебрать файлы нормально с while цикла и запустить awk для каждого из них:

for file in GSM*.bed 
do 
    awk -v OFS="\t" '{print $1, $2, $3, "MPC/K4me1", $4, $5, $6}' "$file" > tmp 
    mv tmp "$file" 
done 

Примечание я использовал OFS, чтобы установить выходной разделитель полей на вкладке. Таким образом, вам не нужно жестко указывать его в команде print.

Чтобы использовать переменную, не используйте -v так:

awk -v OFS="\t" -v your_var="$STR" '{print $1, $2, $3, "MPC/K4me1", $4, $5, $6, your_var}' "$file" > tmp 
+0

я еще один вопрос, если я являюсь AWK в Баш скрипт, я определяю переменную STR = «гиг», как я включить его в команду awk print? {print $ 1, $ 2, $ 3, "MPC/K4me1", $ 4, $ 5, $ 6, $ STR} – Tonja

+0

@Tonja см. мое обновление, вы должны использовать '-v' ->' awk -v STR = "$ STR "{print STR} ''. – fedorqui