Выберите/извлеките столбцы на основе значений на определенной строке

Некоторые процессы сохраняют файлы открытыми для записи. Они могли быть, например, программами, которые пишут журналы, как rsyslogd, сетевые инструменты, как dhclientили что-то еще. Завершение работы их один за другим и попытка перемонтирования могли бы работать.

Можно найти процессы, которые используют определенные файлы при помощи программы fuser. Например, fuser -v -m / возвратит список процессов. Однако я не уверен, является ли это один из них, который заставляет файловую систему напряженно трудиться.

0
04.04.2013, 23:02
3 ответа

Вы могли сделать:

code=$(
  awk '
    NR == 3 {
      for (i=1; i<=NF; i++)
        if ($i > 5) { printf "%s", sep "$" i; sep="," }
      exit sep == ""
    }' file
) &&
  awk "{print $code}" file

Это - вызов awk дважды на том же файле. Первый читает 3-ю строку для построения кода для второго awk вызов. Это выходит после обработки 3-й строки, так не считает целый файл полностью. Это производит что-то как $5,$6,$7, так следующее awk вызов становится:

awk '{print $5,$6,$7}' file
1
28.01.2020, 02:53
  • 1
    Это умно! Огромное спасибо. Действительно ценивший! –  Aron 05.04.2013, 17:44

Я получил другое awk решение совместно использовать:

cat > extract.columns.awk   
BEGIN {   
  infil=ARGV[1]  
    while (getline < infil > 0)  
      if (++n==3)  
      {  
        for(i=1;i<=NF;i++)  
            if ($(i) > 5) x[++j]=i  
    }  
close(infil)    
}  
{  
    for (i=1;i<j;i++)  
    printf("%s ",$x[i])  
    printf("%s\n",$x[j])  
}  

awk-f extract.columns.awk файл

0
28.01.2020, 02:53
  • 1
    Можно хотеть выйти в конце оператора BEGIN если j == 0 постараться не обрабатывать файл, если нет ничего для отображения. –  Stéphane Chazelas 05.04.2013, 18:05
  • 2
    Спасибо, Stephane! Вы означаете добавлять, "если (j == 0) выходят" в конце НАЧАТЬ блока? Вы возражали бы объяснять немного больше? –  Aron 06.04.2013, 01:22
  • 3
    Да, это - то, что я имел в виду. –  Stéphane Chazelas 06.04.2013, 01:24

Пожалуйста, не забудьте упомянуть имя файла дважды, как указано в приведенном ниже коде

awk 'NR == FNR{if(FNR == line) {for(i=1; i<=NF; i++) {if($i > lmt) a[i]} close(FILENAME)} next}
{for(i=1; i<=NF; i++) {for(i in a) {out = (out == "") ? $i : (out FS $i)}}
  print out; out=""}' line=3 lmt=5 file file
0
28.01.2020, 02:53

Теги

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