Выберите текущую и предыдущую строку, если значения совпадают в 2 столбцах - PullRequest
0 голосов
/ 17 февраля 2019

Проверьте значения в столбцах 2 и 3, если значения одинаковы в предыдущей и текущей строках (примерные строки 2-3 и 6-7), затем выведите строки, разделенные как,

Входной файл

1   1   2 35  1
2   3   4 50  1
2   3   4 75  1
4   7   7 85  1
5   8   6 100 1
8   6   9 125 1
4   6   9 200 1
5   3   2 156 2

Требуемый вывод

2,3,4,50,1,2,3,4,75,1
8,6,9,125,1,4,6,9,200,1

Я пытался изменить этот код, но не результаты

awk '{$6=$2 $3 - $p2 $p3} $6==0{print p0; print} {p0=$0;p2=p2;p3=$3}'

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

С обновленным собственным кодом и его механизмом:

awk '(($2=$2) $3) - (p2 p3)==0{printf "%s", p0; print} {p0=$0;p2=$2;p3=$3}' OFS="," file
2,3,4,50,12,3,4,75,1
8,6,9,125,14,6,9,200,1

Но у него есть основная проблема, поэтому лучше использовать этот упрощенный / улучшенный способ:

awk '($2=$2) FS $3==cp{print p0,$0} {p0=$0; cp=$2 FS $3}' OFS=, file

FSнеобходимо, проверьте комментарии под г-н.Ответ Мортона .

Почему ваш код не работает:

  • Конкатенация (что делает пространство) имеет более высокий приоритет, чем минус -.
  • Вы использовали $6 для сохранения значения, которое вы хотите сравнить, и затем оно становится частью $0 строки. (Последний столбец).- Вы можете изменить его на временное имя переменной.
  • У вас есть опечатка (p2=p2), и вы использовали $p2 и $p3, что означает получение значения p2 инайти соответствующий столбец.Так что если p2==3, тогда $p2 равно $3.
  • Вы не установили OFS, поэтому даже если ваш код работает, выходные данные будут разделены пробелами.
  • print добавит завершающий символ новой строки \n, поэтому даже если вышеуказанных проблем не существует, вы получите 4 строки вместо 2 строк, которые вы хотели.
0 голосов
/ 18 февраля 2019

Не могли бы вы попробовать следующее.

awk 'prev_2nd==$2 && prev_3rd==$3{$1=$1;print prev_line,$0} {prev_2nd=$2;prev_3rd=$3;$1=$1;prev_line=$0}' OFS=,  Input_file

Объяснение: Добавление пояснения к приведенному выше коду сейчас.

awk '
prev_2nd==$2 && prev_3rd==$3{     ##Checking if previous lines variable prev_2nd and prev_3rd are having same value as current line 2nd and 3rd field or not, if yes then do following.
  $1=$1                           ##Resetting $1 value of current line to $1 only why because OP needs output field separator as comma and to apply this we need to reset it to its own value.
  print prev_line,$0              ##Printing value of previous line and current line here.
}                                 ##Closing this condition block here.
{
  prev_2nd=$2                     ##Setting current line $2 to prev_2nd variable here.
  prev_3rd=$3                     ##Setting current line $3 to prev_3rd variable here.
  $1=$1                           ##Resetting value of $1 to $1 to make comma in its values applied.
  prev_line=$0                    ##Now setting pre_line value to current line edited one with comma as separator.
}
' OFS=,  Input_file               ##Setting OFS(output field separator) value as comma here and mentioning Input_file name here.
0 голосов
/ 17 февраля 2019
$ awk -v OFS=',' '{$1=$1; cK=$2 FS $3} pK==cK{print p0, $0} {pK=cK; p0=$0}' file
2,3,4,50,1,2,3,4,75,1
8,6,9,125,1,4,6,9,200,1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...