2015-06-24 2 views
3

Нужна помощь в команде awk (или sed), чтобы выбрать строку, только если значение/Строка существует в определенном столбце.Распечатайте строку только в том случае, если строка существует в определенной колонке

Пример:

Я только хочу, чтобы вернуть строку, если слово «истина» есть в колонке 5, не приведи строку обратно, если «истина» не существует в колонке 5

вход:

john,jacob,jingle,schmidt,true 
jason,jack,john,true,false 
oscar,meir,true,weiner,false 
tiffany,amber,false,theissen,true 
jack,john,sally,true,true 

Желаемая Выход:

john,jacob,jingle,schmidt,true 
tiffany,amber,false,theissen,true 
jack,john,sally,true,true 

Я знаю, как тянуть строку назад, что имеет слово и Doesnt есть такое слово, как это:

awk '/true/ && !/false/' 

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

awk 'BEGIN{FS=OFS=","} {sub(/true */, "", $5)} 1' 

, но я не знаю, как объединить эти два.

моя догадка:

awk 'BEGIN{FS=OFS=","} {"/true/",$5} 

худшем случае .... :)

awk 'BEGIN{FS=OFS=","} {sub(/true */, "Unmatchablestring", $5)} 1' | awk '/Unmatchablestring/' 

ответ

4

Вы можете использовать:

awk -F, '$5 == "true"' file 
+0

IMHO требование * ... возвращает строку, если слово «истина» существует в столбце 5 ... * выполняется оператором '~' – hek2mgl

+0

Хм, возможно, но на входе OP отображается только слово 'true 'в нем, поэтому проверка равенства мысли будет более точной. – anubhava

+0

поэтому разница между ~ и ==? – moore1emu

4

Ваш вопрос был немного расплывчатым о том, если вы хотите, чтобы проверить, является ли столбец 5 содержит буквальное значение true или если оно должно быть точным совпадением. Если вы хотите проверить, если столбец 5 содержитtrue, чем использовать оператор матча ~, как это:

awk -F, '$5 ~ /true/' file 

В противном случае следуйте anubhava's answer.

+1

@EdMorton Большое спасибо за этот комментарий! Мне уже было интересно об этом. Я сделал несколько тестов, и он «работал», как ожидалось, но теперь я знаю, почему! Я изменил это. – hek2mgl

+0

что было комментарий Эд Мортона? Также в этом случае значение может быть только True или False в 5-м столбце. Но у меня есть другие места, где можно использовать подобную команду. Спасибо. Если бы я хотел сделать истину или ложь в столбце 5, я бы сделал: awk -F, '$ 5 ~/True/&/False /' – moore1emu

+1

@ moore1emu В моей первой версии использовалась '' true ''вместо'/true/'. Хотя это тоже сработает и будет локально таким же, как и в текущей версии, это вызовет ненужные накладные расходы, поскольку для преобразования строки '' true ''в шаблон'/true/'потребуется преобразовать строку. Когда я говорю * накладные расходы, я имею в виду наносекунды (!), Поэтому ничего не стоит беспокоиться о вас, но хорошо знать для меня. Эд упомянул об этом, и я оценил этот комментарий. – hek2mgl

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