2015-04-01 2 views
0

Я пытаюсь удалить определенные столбцы из текстового файла в строках, соответствующих строке, но затем оставит остальную часть строк нетронутой.Удалить столбцы, когда строка соответствует условию

Скажем, у меня есть файл (тысячи строк в действительности)

10 12 a 
USA John TGCAGG 
USA John TGCATG 
5 2 b 
CAN Tom TGCACG 
CAN Tom TGCAAC 
.... 

И я хочу, чтобы создать новый файл, который удаляет 2-й столбец в строках, содержащих TGCA, но оставляет все остальные линии нетронутыми. Я хотел бы видеть:

10 12 a 
USA TGCAGG 
USA TGCATG 
5 2 b 
CAN TGCACG 
CAN TGCAAC 

я могу изменить столбцы печатать на линиях, которые соответствуют с использованием регулярных выражений, чтобы начать AWK или СЭД, но я не могу получить другие линии (которые не изменяются) для печати или сохранить порядок этих линий.

Должен ли я использовать оператор if в awk? Пробовал использовать следующий, но я не думаю, что у меня есть это право.

ответ

3

Я бы сказал:

$ awk '/TGCA/ {$2=$3; NF--} 1' file 
10 12 a 
USA TGCAGG 
USA TGCATG 
5 2 b 
CAN TGCACG 
CAN TGCAAC 

То есть: когда строка содержит TGCA, замените 2-й столбец с 3-м и уменьшить количество полей. То есть, удалите второй столбец.

+0

Я не совсем понимаю, как здесь используется NF или как установить желаемое количество полей ... Что делать, если было 4 столбца, и я хотел сохранить 3 и 4? Или скажем, я хотел сохранить столбцы 1 и 3 и 4 (но не 2)? Есть ли более общий способ сделать это (или объяснить код) без уменьшения полей? –

+0

Весьма сложно удалить столбец в awk. Чтобы предотвратить получение конечных пробелов, я хотел бы сделать что-то вроде этого: [как удалить первые два столбца в файле с помощью оболочки (awk, sed, что угодно)] (http://stackoverflow.com/a/14715189/1983854) – fedorqui

+0

Поэтому, если вы можете позволить себе просто уменьшить 'NF', это нормально. Если он должен быть более сложным, я все равно сделаю какое-то движение столбцов и, наконец, уменьшу 'NF'. – fedorqui

2

С GNU СЭД:

sed '/TGCA/ s/\s\+\S*//' filename 

Это удаляет из строк, содержащих TGCA первое вхождение одного или нескольких пространств с последующим любым количеством не-пространств - который является второй столбец и пространство (ами).

Для BSD sed это должно быть изменено, потому что оно не понимает \s или \S (или \+ - это немного больно). В этом случае

sed '/TGCA/ s/[[:space:]]\{1,\}[^[:space:]]*//' filename 

делает то же самое.

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