2015-06-02 6 views
0

У меня есть сотни .dat файла с данными в сторону, и я хочу, чтобы AWK их с помощью командыКак awk через несколько файлов?

awk 'NR % 513 == 99' data.0003.127.dat > data.0003.127.Ma.dat 

Я попытался написать файл сценария как

for i in {1 ... 9}; do 
i=i*3 
datafile = sprintf("data.%04d.127.dat",i) 
outfile = sprintf("data.%04d.127.Ma.dat",i) 
awk 'NR % 513 == 99' datafile > outfile 
done 

Мне нужно только 000300060009. .. файлы, но приведенный выше сценарий не работает нормально. Ошибка:

bash: ./Ma_awk.sh: line 3: syntax error near unexpected token `(' 
bash: ./Ma_awk.sh: line 3: `datafile = sprintf("data.%04d.127.dat",i)' 

Что мне делать дальше? Я использую ubuntu 14.04.

+2

несколько вопросов: не используйте пробелы вокруг присвоения переменных, т.е. удалить пробелы перед и после '='. Также, когда вы ссылаетесь на переменную в 'bash', вы должны использовать' '' 'знак i.e.' '$ datafile" 'Обратите внимание, что при работе с именами файлов целесообразно использовать двойные кавычки. Тогда 'sprintf' не существует в' bash' вместо 'printf'. 'datafile = $ (printf"% 04d "$ i) – Pankrates

+1

Арифметика должна выполняться с помощью' ((i = i * 3)) 'или некоторой эквивалентной нотации. –

ответ

3

В Баш (с v4) можно написать выражение последовательности с приращением:

$ echo {3..27..3} 
3 6 9 12 15 18 21 24 27 

Вы можете также включать ведущие нули, которые будут сохранены:

$ echo {0003..0027..3} 
0003 0006 0009 0012 0015 0018 0021 0024 0027 

Таким образом, вы можете использовать следующие:

for i in {0003..0027..3}; do 
    awk 'NR % 513 == 99' "data.$i.127.dat" > "data.$i.127.Ma.dat" 
done 
+0

@etan: true, но OP утверждает, что Ubuntu 14.04 – rici

2

Существует несколько проблем с вашим кодом, просто потому, что они являются ошибками синтаксиса bash.

  1. Не используйте пробелы вокруг присваивания значения переменной
  2. Brace expension выглядит {1..9}
  3. Захват стандартный вывод в переменную осуществляется через =$() нотации
  4. Эталонные переменные со знаком доллара $
  5. Специально для имена файлов используют двойные кавычки ", чтобы гарантировать, что аргумент считается одним

Теперь я не считаюсь фактической обоснованностью вашей AWK программы, но исправления ошибок синтаксиса Баша будет выглядеть следующий

#!/usr/bin/env bash 

for i in {1..9}; do 
    datafile=$(printf "data.%04d.127.dat" $i) 
    outfile=$(printf "data.%04d.127.Ma.dat" $i) 
    awk 'NR % 513 == 99' "$datafile" > "$outfile" 
done 

Это не заботиться о правильных границах итерации с шагом три, но так как вы не указали верхнюю границу я оставлю это упражнение для вас

+0

Я думаю, что это 'для i в {3..27..3}' – rici

+1

Вы правы, но он не указал верхнюю границу, и это было последнее, что было не так с его сценарием – Pankrates

+0

Есть много чего не так со сценарием, но вы не выбрали верхнюю границу «9» из воздуха; это было там. Я просто имел в виду, что вы отказались от попытки умножить i на 3. – rici

Смежные вопросы