awk: фильтровать файл журнала на основе значений в выбранном столбце

#awk #sed

#awk #sed

Вопрос:

Работа с такого рода входными данными, расположенными в многоколоночном формате:

 #dlgfn #in cluster #LE #rmsd #ats #tors #h_ats #lig_eff 
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_12_lig_cne_177,1, -2.3600, 238.8992,  80, 29, 2, -0.0303
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_08_lig_cne_177,1, -2.0900, 238.8239,  80, 29, 2, -0.0268
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_08_lig_cne_177,1, -1.9600, 239.3082,  80, 29, 2, -0.0251
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_12_lig_cne_177,1, -1.9300, 238.6729,  80, 29, 2, -0.0247
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_12_lig_cne_177,2, -1.5500, 239.4734,  80, 29, 2, -0.0199
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_12_lig_cne_177,1, -1.0900, 240.2418,  80, 29, 2, -0.0140
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_08_lig_cne_177,1, -0.7700, 212.9619,  80, 29, 2, -0.0099
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_09_lig_cne_177,3, -0.7200, 218.4045,  80, 29, 2, -0.0092
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_09_lig_cne_177,2, -0.6800, 201.6466,  80, 29, 2, -0.0087
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_10_lig_cne_177,2, -0.6300, 240.4892,  80, 29, 2, -0.0081
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_10_lig_cne_177,1, -0.5400, 240.1765,  80, 29, 2, -0.0069
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_09_lig_cne_177,1, -0.5000, 215.6699,  80, 29, 2, -0.0064
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_07_lig_cne_177,1, -0.3800, 199.5818,  80, 29, 2, -0.0049
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_10_lig_cne_177,2, -0.3400, 240.5046,  80, 29, 2, -0.0044
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_09_lig_cne_177,1, -0.3300, 218.2226,  80, 29, 2, -0.0042
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_12_lig_cne_177,1, -0.2700, 231.5438,  80, 29, 2, -0.0035
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_05_lig_cne_177,1, -0.0600, 200.8627,  80, 29, 2, -0.0008
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_04_lig_cne_177,2, -0.0300, 220.3135,  80, 29, 2, -0.0004
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_09_lig_cne_177,1, -0.0000, 221.4531,  80, 29, 2, -0.0000
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_08_lig_cne_177,1,  0.0300, 231.2099,  80, 29, 2,  0.0004
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_12_lig_cne_177,1,  0.0400, 240.5225,  80, 29, 2,  0.0005
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_12_lig_cne_177,1,  0.0500, 232.5498,  80, 29, 2,  0.0006
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_12_lig_cne_177,1,  0.0600, 229.8094,  80, 29, 2,  0.0008
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_11_lig_cne_177,2,  0.2300, 218.2757,  80, 29, 2,  0.0029
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_09_lig_cne_177,3,  0.2700, 220.3585,  80, 29, 2,  0.0035
/Users/gleb/Desktop/scripts/analys_clusters/sub_folders_to_analyse/7000_cne_lig177.AllBoxes/7000_09_lig_cne_177,1,  0.3700, 219.5366,  80, 29, 2,  0.0047
 

Я использую следующее выражение AWK для сканирования журнала и печати номера строки 2-й, 3-й и 5-й столбцы, пропуская первую строку (заголовок):

    gawk -F'^[^,]*,|, ' 'NR> 1{ print   lineNumber, $2, $3, $5 }' OFS=', ' "${tmp}"/${dir_name}_cl_${c}.txt >> "${tmp}"/${dir_name}_RG_${c_mod}_proc.csv
 

Получение такого вывода:

 ID, POP, dG, LIG
1, 1, -2.3600,  80
2, 1, -2.0900,  80
3, 1, -1.9600,  80
4, 1, -1.9300,  80
5, 2, -1.5500,  80
6, 1, -1.0900,  80
7, 1, -0.7700,  80
8, 3, -0.7200,  80
9, 2, -0.6800,  80
10, 2, -0.6300,  80
11, 1, -0.5400,  80
12, 1, -0.5000,  80
13, 1, -0.3800,  80
14, 2, -0.3400,  80
15, 1, -0.3300,  80
16, 1, -0.2700,  80
17, 1, -0.0600,  80
18, 2, -0.0300,  80
19, 1, -0.0000,  80
20, 1,  0.0300,  80
21, 1,  0.0400,  80
22, 1,  0.0500,  80
23, 1,  0.0600,  80
 

Как я могу изменить это выражение gawk, чтобы настроить фильтр для 3-го столбца, чтобы все строки из исходного журнала содержали положительные значения? Примечательно, что строки уже упорядочены на основе значения в 3-м столбце, поэтому в основном каждый раз, когда мне нужно пропустить N последних строк (с положительными значениями в третьем столбце). В качестве альтернативы я могу использовать некоторое выражение sed (с -i) для редактирования существующего файла, удаляя эти ссылки?

Ответ №1:

Как я могу изменить это выражение gawk, чтобы настроить фильтр для 3-го столбца, чтобы все строки из исходного журнала содержали положительные значения?

Вы можете использовать amp;amp; для и и || для ИЛИ в awk условии, пожалуйста, попробуйте следующее:

 (NR>1 amp;amp; $3<0.0){ print   lineNumber, $2, $3, $5 }
 

Комментарии:

1. gawk: ligne de commande:1: (NR>1 amp;amp; amp;3>=0.0){ печать Номер строки, $2, $3, $7 } gawk: ligne de commande:1: ^ синтаксическая ошибка

2. @HotJAMS вы ввели amp; 3 вместо $ 3… Дважды проверьте свой код

3. Я допустил ошибку опечатки в своем ответе, который я отредактировал, пожалуйста, попробуйте сейчас

4. В любом случае, положительные значения не должны печататься. Кроме того, при этом не будут напечатаны правильные номера строк, поскольку вы не увеличиваете номер строки, если вы не печатаете…

5. @DaemonPainter HotJAMS заявил, что пропускаемые строки всегда являются последними

Ответ №2:

Не могли бы вы, пожалуйста, попробовать следующее, основываясь только на показанных вами образцах, написанных и протестированных с помощью GNU awk .

 awk -F',[[:space:]]*' -v OFS=", " '
FNR==1{
  print "ID, POP, dG, LIG"
  next
}
$3<0{
  print   line,2,$3,$5
}
$3>=0{ exit }'  Input_file
 

Объяснение: добавление подробного объяснения выше.

 awk -F',[[:space:]]*' -v OFS=", " '  ##Starting awk program from here, setting FS as comma with spaces and OFS as comma space.
FNR==1{                              ##checking condition if this is first line then do following.
  print "ID, POP, dG, LIG"           ##Printing header here.
  next                               ##next will skip further statements from here.
}
$3<0{
  print   line,2,$3,$5              ##Printing FNR-1, 2nd 3rd and 5th fields here.
}'  Input_file                       ##Mentioning Input_file name here.
 

Выходные данные для показанных образцов будут следующими:

 ID, POP, dG, LIG
1, 2, -2.3600, 80
2, 2, -2.0900, 80
3, 2, -1.9600, 80
4, 2, -1.9300, 80
5, 2, -1.5500, 80
 

Комментарии:

1. он делает то же самое, что и моя версия GAWK, поэтому печатает ВСЕ СТРОКИ, в то время как мне нужно исключить все строки, содержащие положительное значение в третьем столбце (dG)

2. @HotJAMS, уверен, что отредактировал решение сейчас, не могли бы вы проверить сейчас один раз и сообщить мне, если это поможет, спасибо.

3. ДА, теперь это работает, большое вам спасибо! Один вопрос, в чем разница между GAWK и AWK ? 🙂

4. При этом не будет выведен правильный номер строки, поскольку вы не обновляете номер строки, если не печатаете…

5. эй, да, я подтверждаю, что в моих входных данных строки уже отсортированы на основе третьего столбца, поэтому после 0 отрицательных значений больше нет. То, что я искал, — это удалить только N последних строк (которые всегда имеют положительные значения)