выборочно удалять строки - PullRequest
0 голосов
/ 30 марта 2012

У меня есть текстовый файл с разделенными табуляцией данными, распределенными по 16 столбцам.Я хочу удалить всю строку, в которой значения 660, 1068 и 907 находятся в 6-м столбце.

9513    2010-06-15 17:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 18:00:02 \N
9523    2010-06-15 18:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 19:00:02 \N
9534    2010-06-15 19:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 20:00:02 \N
9543    2010-06-15 20:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 21:00:02 \N
9552    2010-06-15 21:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 22:00:02 \N
9560    2010-06-15 22:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-15 23:00:02 \N
9569    2010-06-15 23:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-16 00:00:02 \N
9579    2010-06-16 00:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-16 01:00:02 \N
9589    2010-06-16 01:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-16 02:00:01 \N
9599    2010-06-16 02:00:00 94  0   69  12  0   0   0   0.0000  0   \N  \N  \N  2010-06-16 03:00:02 \N
95642733    2011-10-19 19:00:00 4341    0   1263    0   11  0   0   0.0000  0   \N  \N  \N  2011-10-19 20:05:06 \N
95642732    2011-10-19 19:00:00 4341    0   1260    0   24635   0   0   0.0000  0   \N  \N  \N  2011-10-19 20:05:06 \N
95642540    2011-10-19 19:00:00 4050    0   1068    103 113 2   0   0.0000  0   \N  \N  \N  2011-10-19 20:05:06 \N
95642539    2011-10-19 19:00:00 4050    0   907 19  0   0   0   0.0000  0   \N  \N  \N  2011-10-19 20:05:06 \N

Ответы [ 4 ]

4 голосов
/ 30 марта 2012

Awk - это инструмент, который вы хотите использовать.

awk '$6==1260 || $6==1068 || $6==907 {next} {print}'

Что это делает?

Awk запускает блок кода в каждой строке вашего файла,Код начинается с выражения, которое должно оценивать true (в данном случае три возможных значения 6-го поля), за которыми следуют команды в фигурных скобках.В этом случае команда next указывает ей перейти к следующей строке ввода, не выполняя никаких команд.

Если три сравнения НЕУДАЧИЛИ, а мы не запускаем next, то мы печатаемлиния.

0 голосов
/ 30 марта 2012

Это может работать для вас (GNU sed?):

sed '/^\(\S*\s*\)\{5\}\(1260\|1068\|907\)\s/d' file

или вообще:

sed '/^\([^[:space:]]*[[:space:]]*\)\{5\}\(1260\|1068\|907\)[[:space:]]/!d'
0 голосов
/ 30 марта 2012
awk '$6!=1260 && $6!=1068 && $6!=907' file
0 голосов
/ 30 марта 2012

То, что вы хотите от нас, это awk .Awk - удивительно мощный язык в UNIX, и если вы когда-нибудь столкнетесь со сложной проблемой потоковой передачи тестов, awk станет вашим решением.

Попробуйте этот скрипт:

awk '{
if ($6 != 1260 || $6 != 1068 || $6 != 907)
   print $0;
}' file.txt >> output_file.txt
...