Как получить подстроку в awk - PullRequest
1 голос
/ 19 апреля 2010

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

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

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

EDIT

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

РЕДАКТИРОВАТЬ 2

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

1 Ответ

2 голосов
/ 19 апреля 2010
$ cat file
FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 0.50 0.50 0.50 -43.00 100010101101110101000111010
FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 1.50 1.50 1.50 -42.00 100010111101110101000111010

$ awk 'substr($13,8,1)==1{ print "1->"$0 } substr($13,8,1)==0{ print "0->"$0 }' file
0->FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 0.50 0.50 0.50 -43.00 100010101101110101000111010
1->FOO BAR 0.40 0.20 0.40 0.50 0.60 0.80 1.50 1.50 1.50 -42.00 100010111101110101000111010
...