Это то, что я в итоге сделал, чтобы заставить его работать. Мне пришлось изменить длину на число с плавающей точкой to_f
, затем я смог заставить его правильно тестировать в консоли.
def first_half(list)
list[0...(list.length.to_f / 2).ceil]
end
def last_half(list)
list[(list.length.to_f / 2).ceil...list.length]
end
Использование .ceil
в обоих методах позволило математике работать.
Ключевой пункт здесь то, что символ вертикальной черты (|
) должен быть оставлен к оболочке. Используйте"\|
"или"'|'
"чтобы защитить его от интерпретации оболочки и позволить ему быть переданным awk
на командной строке.
Чтение комментариев, я вижу, что исходный плакат представляет упрощенную версию исходной проблемы, которая включила фильтрацию file
прежде, чем выбрать и распечатать поля. Передача через grep
использовался и результат передается по каналу в awk для полевого выбора. Это составляет совершенно ненужное cat file
это появляется в вопросе (он заменяет grep <pattern> file
).
Прекрасный, который будет работать. Однако awk является в основном инструментом сопоставления с образцом самостоятельно и может доверяться, чтобы найти и работать над согласующими отрезками длинной линии, не будучи должен вызвать grep
. Используйте что-то как:
awk -F\| '/<pattern>/{print $2;}{next;}' file
/<pattern>/
бит говорит awk
выполнить действие, которое следует строки то соответствие <pattern>
.
Выглядящий словно потерявший {next;}
пропуск действия по умолчанию к следующей строке во входе. Это, кажется, не необходимо, но у меня есть эта привычка от давно...
Или просто используйте одну команду:
cut -d '|' -f FIELDNUMBER
Символа вертикальной черты нужно оставить так, чтобы оболочка не интерпретировала его. Простое решение:
$ awk -F\| '{print $2}' file
Другой выбор состоял бы в том, чтобы заключить символ в кавычки:
$ awk -F'|' '{print $2}' file
И 'файл' не содержит символов вертикальной черты, таким образом, он ничего не печатает. Необходимо или использовать 'файл кошки' или просто перечислить файл после awk программы.