2013-11-08 4 views
0

У меня есть куча текстовых файлов, которые нуждаются в очистке. Я использую UNIX bash, поэтому AWK или grep хороши.Удаление некоторых строк в текстовых файлах с использованием UNIX

Текстовые файлы, выглядящий примерно так:

1766 1789 
1764 1790 
1762 1849 
0 
1357 1817 
1366 1857 
0 
360 42 
352 95 
0 
293 142 
302 181 
delete-this 
0 
302 181 
0 

То, что я хочу, чтобы удалить все строки с «0», «удалить-это», только одна строка с двумя колонками или тремя рядами с двумя колоннами ,

Результат должен выглядеть следующим образом:

1766 1789  
1762 1849 
1357 1817 
1366 1857  
360 42 
352 95  
293 142 
302 181 

Спасибо большое!

Дополнительная информация: Сумма столбца 2 столбца 2 и строки 2 должна быть> 1, если нет, строка 2 должна быть удалена.

+0

Есть некоторые строки, отсутствующие в вашей выборке вывод. Почему '1764 1790' исчезает? Кроме того, что вы имеете в виду «только одна строка с двумя столбцами или тремя строками с двумя столбцами»? – fedorqui

+0

Первые три строки должны быть только два! Потому что разница в столбце 1 строки 1 и столбце 2 столбца 1 = 1. – user2966591

+0

Итак, вы хотите просто сопоставить блоки из 2/3 строк, окруженных строками с '0'. – fedorqui

ответ

2

Это был крепкий орешек, или трудно понять, но здесь мы идем снова:

awk '/[0-9]+ [0-9]+/ {a[++t]=$0;b[t]=$2;next} {if (t>=2) for (i=1;i<=t;i++) {if (b[i]-c!=1) print a[i];c=b[i]};t=0}' 
1766 1789 
1762 1849 
1357 1817 
1366 1857 
360 42 
352 95 
293 142 
302 181 

Как это работает:

awk ' 
    /[0-9]+ [0-9]+/ {    # if line does have 2 column of number, then 
     a[++t]=$0     # add line to array "a" and increment variable "t" 
     b[t]=$2      # add column 2 to array "b" 
     next      # go to next line 
     } 

     { 
     if (t>=2)     # is there more two or more lines with numbers connrected, then 
      for (i=1;i<=t;i++) { # loop trough array "a" with all numbers 
       if (b[i]-c!=1)  # test if the difference between this number in column 2 is more than 1 compare to previous line 
        print a[i]  # then print array "a" 
        c=b[i]   # store array "b" information in variable "b" 
       } 
      ;t=0     # clear counter "t" 
     }' file 
+1

Очень хорошо! Но как удалить одиночные строки и тройные строки? – user2966591

+0

Это должно сделать то, – Jotne

+0

My bad! Это были строки одинаковые, поэтому я был смущен. Все хорошо! :) – user2966591

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