столбцы awk на основе условия с заголовком

n=0
for filename in shivi11*; do
    n=$(( n + 1 ))
    mv -i "$filename" "output_$n"
done

... где shivi11*— шаблон, который должен соответствовать всем файлам, которые вы хотите переименовать (и ничему другому ).

Создайте резервную копию данных и проверьте это.


Ответьте на исходный вопрос(перед его редактированием):

Если вы под «разделить» подразумеваете утилиту split, то вы можете вызвать утилиту, подобную этой, чтобы получить то, что вы хотите (это предполагает GNU splitи что вы хотели бы разделить файл fileна 20 КБ бит):

split -b 20k -a 1 --numeric-suffixes=1 file output_

Это создает output_1, output_2и т. д.

Обратите внимание, что, поскольку мы ограничиваем длину суффикса одним символом с помощью -a 1, он не сможет быть разделен более чем на 9 файлов. Использование, например. -a 2создаст файлы с именами output_01, output_02и т. д. вплоть до output_99включительно, но не output_100.

Опция --numeric-suffixes=1является специфической для GNUsplit-опцией, которая выбирает числовые суффиксы, начинающиеся с заданного числа (вместо 0, как при использовании -d). Обычно splitсоздает файлы с буквенными суффиксами.

-3
08.02.2021, 18:42
3 ответа

На основании моей интерпретации требований

 awk 'NF==1 { head=$0; printed=0; }
      NF==3 && $3>20 { 
          if(!printed) {
              printed=1;
              if(firstdone)print ""; else firstdone=1;
              print head
          }
          print
      }' inputfile

или более короткие варианты

awk 'NF==1 { head=$0; printed=0; }
     NF==3 && $3>20 {
         if(!printed++) {
             if(firstdone++)print "";
             print head
         };
         print
     }' inputfile
awk 'NF==1 { head=$0; }
     NF==3 && $3>20 {
         if(head) {
             if(firstdone++)print "";
             print head;
             head=""
         };
         print
     }' inputfile

С входом

variable1
10 20 30
40 50 60

variable2
2 4 40
3 2 1

variable3
10 10 10
5 5 5

variable4
1 1 1
2 2 21
3 3 3

вывод

variable1
10 20 30
40 50 60

variable2
2 4 40

variable4
2 2 21
1
18.03.2021, 22:31

На основе одной интерпретации ваших требований:

awk '(NF<3) || ($3 > 20)' file
1
18.03.2021, 22:31

На основе ваших исправлений:

awk 'NF<=1 || (NF==3 && $3>20)' input

Будет напечатана строка, если она пуста, содержит только одно слово (= строка заголовка )или содержит три поля, третье из которых больше 20.

Изменить Ваша последняя редакция вопроса сделала этот ответ устаревшим. Обратитесь к ответу @Bodo для решения на основе awk-, которое соответствует вашим требованиям.

1
18.03.2021, 22:31

Теги

Похожие вопросы