Для масштабируемого очищения всех полей от энного до mth в команда awk
вы не были должны hardcode значения; необходимо использовать "для" цикла:
awk 'BEGIN { FS = ","; OFS = ","} {for (i = 3; i <= 4; i++) { $i = "" }; print}' inputfile
, Если вы хотите заменить другой диапазон пустым местом, скорректируйте значения "3" и "4" в вышеупомянутом коде.
Объяснение:
Эти НАЧИНАЮТСЯ {...}
блок обрабатывается перед рассмотрением любой из строк файла.
OFS
устанавливает выходного разделителя полей, и , FS
устанавливает разделителя полей для входа. Мы хотим, чтобы они оба были запятыми.
для
цикл точно так же, как синтаксис C. В этом случае это выполняет следующий {блок кода}
для я
как 3 и как 4.
$i
заслуживает упоминания, потому что это совершенно непохоже на синтаксис оболочки. В сценариях оболочки название переменной должно быть снабжено префиксом $
для расширения до значения переменной. Не так в awk
. В awk
, я
отдельно расширяюсь до его значения — 3 или 4 в этом случае — и , $
сопровождаемый числом означает поле в той пронумерованной позиции. Так $i =""
наборы я
th поле к пустой строке.
Затем печать
команда, данная без аргументов, значений по умолчанию к печати всей строки. На самом деле это берет все поля строки, как разграничено FS
, и, как изменено любыми предыдущими командами, и печатает их всех, разделенных OFS
и сопровождаемый новой строкой в конце.
эквивалент короче управляйте:
Я считаю, что приведенная выше команда является самой чистой и легко расширяемой, если вы собираетесь включить ее в сценарий. Это очень ясно о том, что он делает и очень читаемо. Кроме того, вся вещь может быть разбита на автономный сценарий awk
без изменений; что-то, что невозможно сделать автоматически при использовании -v
и -F
переключается на вызов awk
. (Это не причина не использовать их, конечно. Просто то, что нужно знать.)
Для одноразового использования, особенно, я бы использовал следующее:
awk -F, -v OFS=, '{for (i = 3; i <= 4; i++) { $i = "" }; print}' inputfile
Переключатель -F
устанавливает значение FS
. Переключатель -v
позволяет задавать значения переменных awk
в командной строке.
В более общем плане, переключатель -v
может быть чрезвычайно полезен для передачи переменных оболочки в виде переменных awk: -v myawkvar = «$ myshellvar»
и для изменения поведения во время выполнения автономного сценария awk
, который извлекается из файла сценария с параметром -f scriptname
Ваш код почти готов, теперь все, что вам нужно сделать, это рассматривать $cmd
как очередь строк, заканчивающихся новой строкой -. В наивном Python -псевдокод -, потому что я давно не писал PHP:
input = ''
try:
first_command, remaining_input = input.split('\n', 1)
execute(first_command)
input = remaining_input
except ValueError:
# No newline yet; we have to wait for more input
input = socket.receive()
Таким образом, вы можете обрабатывать как потоки ввода, так и отдельные интерактивные команды, которые, вероятно, не будут использоваться в вашем приложении.