Проверьте значения и проверьте, есть ли разница с awk - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь сравнить значения, полученные из файла CSV, который запускается несколько раз, уже проанализирован это часть CSV-файла

0 20.00GB  
1 20.00GB  
2 20.00GB  
3 20.00GB  
8 21.00GB  
9 21.00GB  
10 21.00GB  
11 21.00GB  
16 22.00GB  
17 22.00GB  
18 22.00GB  
19 22.00GB  
24 23.00GB  
25 23.00GB  
26 23.00GB  
27 23.00GB  
0 44.00GB  

...

То, что я хочу сделать, для той же самой проверки идентификаторов, если во втором столбце есть разница в значении Это то, что я имею на данный момент

function checkdif() {
awk -F, '{print $1" "$12}' $1
 }

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Следующая команда awk сделает то, что вы ищете:

для того же идентификатора проверьте, если во втором столбце есть другие значения

input1:

$ cat check_id
0 20.00GB  
1 20.00GB  
2 20.00GB  
3 20.00GB  
8 21.00GB  
9 21.00GB  
10 21.00GB  
11 21.00GB  
16 22.00GB  
17 22.00GB  
18 22.00GB  
19 22.00GB  
24 23.00GB  
25 23.00GB  
26 23.00GB  
27 23.00GB  
0 44.00GB 

id = 0 имеет 2 различных значения 20.00GB и 44.00GB

input2:

$ cat check_id2
0 20.00GB  
1 20.00GB  
2 20.00GB  
3 20.00GB  
8 21.00GB  
9 21.00GB  
10 21.00GB  
11 21.00GB  
16 22.00GB  
17 22.00GB  
18 22.00GB  
19 22.00GB  
24 23.00GB  
25 23.00GB  
26 23.00GB  
27 23.00GB  
0 20.00GB 

Все идентификаторы имеют одинаковое значение во 2-м столбце

run1:

awk '{b[$1]++;if(b[$1]>1 && a[$1]!=$2){print "id: "$1" has 2 different values "a[$1]" and "$2;test=1;exit};a[$1]=$2}END{if(test==0)print "All identical ids have the same value in the second column"}' check_id 
id: 0 has 2 different values 20.00GB and 44.00GB

RUN2:

awk '{b[$1]++;if(b[$1]>1 && a[$1]!=$2){print "id: "$1" has 2 different values "a[$1]" and "$2;test=1;exit};a[$1]=$2}END{if(test==0)print "All identical ids have the same value in the second column"}' check_id2
All identical ids have the same value in the second column

Команда для удобства чтения:

# Rule(s)     
{ 
  #associative array to count the number of occurrences of a specific id    
  b[$1]++
  #when we encounter the element a second time and if the value is different then the previous encountered (stored in a)
  #we print that the ids are different and we stop the execution of awk
  #if you want to print all the ids that have different values then remove the exit
  #the test variable is used to not print the default message in the END clause
  if (b[$1] > 1 && a[$1] != $2) {
    print "id: " $1 " has 2 different values " a[$1] " and " $2
    test = 1
    exit
  }
  #store in the associative array a the pairs id <-> value
  a[$1] = $2
}

# END rule(s)     
END {
  if (test == 0) {
    #if we reach this point it is that all identical ids have the same value in the second column
    print "All identical ids have the same value in the second column"
  }
}
0 голосов
/ 27 марта 2019

Я думаю, вы пытаетесь напечатать только те строки, в которых значение во 2-м столбце изменилось по сравнению с предыдущей строкой.Это может быть не то, что вам нужно, хотя, пожалуйста, включите пример правильного вывода в ваш вопрос.

Вы можете использовать переменную awk (в данном случае p) и установить для нее значение$2 как последнее, что вы делаете при обработке строки.

Первый шаблон p != $2 { print } означает, что мы проверяем, равно ли 2-е поле текущей строки p, что является значением изпредыдущая строка.

awk 'p != $2 { print } { p = $2 }' /tmp/data.txt

Т.е. с учетом следующего (содержимое /tmp/data.txt)

0 20.00GB  
1 20.00GB  
2 20.00GB  
3 20.00GB  
8 21.00GB  
9 21.00GB  
10 21.00GB  
11 21.00GB  
16 22.00GB  
17 22.00GB  
18 22.00GB  
19 22.00GB  
24 23.00GB  
25 23.00GB  
26 23.00GB  
27 23.00GB  
0 44.00GB 

Я предполагаю, что вы хотите произвести

0 20.00GB
8 21.00GB
16 22.00GB
24 23.00GB
0 44.00GB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...