Как получить подстроку в awk

Это одна строка входного файла:

FOO BAR 0,40 0,20 0,40 0,50 0,60 0,80 0,50 0,50 0,50 -43,00 100010101101110101000111010

И команда awk, которая проверяет определенную позицию, является ли она «1» или «0» в столбце 13. Что-то вроде:

 awk -v values="${values}" '{if (substr($13,1,1)==1) printf values,$1,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13}' foo.txt > bar.txt

Переменная значений работает, но я просто хочу в приведенном выше примере проверить, равен ли первый бит «1».

ИЗМЕНИТЬ

Итак, я думаю, что я не очень ясно выразился в своем вопросе. «$13» в методе substr на самом деле является битовой строкой. Итак, этот awk хочет передать все строки в foo.txt, которые имеют «1» в позиции «1» битовой строки в столбце «$13». Надеюсь, это проясняет ситуацию.

ИЗМЕНИТЬ 2

Хорошо, позвольте мне сломать это очень легко. Приведенный выше код является примером, поэтому строка ввода является одной из МНОГИХ строк. Таким образом, не все строки имеют 1 в позиции 8. Я дважды проверил, имеет ли определенная позиция оба вхождения, так что в любом случае я должен получить какой-то результат. Дело в том, что во всех строках он не находит «1» в выбранных мною позициях, но когда я говорю, что он должен найти «0», он возвращает мне все строки.


person lugte098    schedule 19.04.2010    source источник
comment
Ваша команда awk работает для меня на основе вашего отредактированного требования. Как это не работает для вас? Есть ли поля после 13 числа? Если нет, вы можете напечатать $0, то есть всю строку (printf values,$0)   -  person Dennis Williamson    schedule 19.04.2010
comment
Я мог бы использовать 0 долларов, если бы не тот факт, что я специально исключил 2 доллара. Таким образом, последовательность равна $1, $3, $4 и т. д. Я хочу сказать: если 8-я позиция битовой строки (13-й столбец в каждой строке foo.txt) равна 1, то добавьте эту строку в bar.txt   -  person lugte098    schedule 19.04.2010
comment
Упс, я пропустил недостающие 2 доллара. Что вы получите, если воспользуетесь if (substr($13,8,1)==1) printf ...? Это должно сработать.   -  person Dennis Williamson    schedule 19.04.2010
comment
странно то, что если я говорю if (substr($13,8,1)==1), это ничего мне не дает, когда я использую if (substr($13,8,1)==0), это дает мне все. И эта проблема возникает на каждой позиции. 1 ничего не дает, 0 дает мне все.   -  person lugte098    schedule 19.04.2010
comment
0 дает вам все, потому что позиция 8 равна 0, и утверждение if становится истинным, если вы делаете if (substr($13,8,1)==0 ! вы делаете это очень запутанным. показать результат, который вы хотели.   -  person ghostdog74    schedule 19.04.2010


Ответы (1)


person    schedule
comment
Я хочу иметь возможность указать позицию 1 или 0. Только в примере OP использовалась первая позиция. - person lugte098; 19.04.2010
comment
покажите действительный пример вашего входного файла и более четко опишите, используя этот входной файл. Я не могу понять вашу проблему. ваш оператор подстроки в OP верен, если вы пытаетесь вытащить 1-й символ 13-го поля. почему это не работает для вас? если вы хотите 8-ю позицию по 13 долларов, то сделайте substr($13,8,1)==1 - person ghostdog74; 19.04.2010
comment
я редактировал ОП. Я использую этот substr($13,8,1)==1, но, похоже, он не работает. - person lugte098; 19.04.2010
comment
что кажется не работает? позиция 8 из 13 долларов - это 0, верно? вот почему это не работает, так как вы проверяете против 1. - person ghostdog74; 19.04.2010