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

chr1        10        20        3 
chr1        15        30        9 
chr1        55        60        1
1
Rui F Ribeiro 6 Янв 2019 в 16:21
2
totally new to awk --> проверьте unix.stackexchange.com/tags/awk/info
 – 
Sundeep
14 Фев 2018 в 05:23
Я насчитал 12 столбцов...?
 – 
Jeff Schaller
14 Фев 2018 в 05:30
4 столбца в 3 ряда.
 – 
PDM
14 Фев 2018 в 05:41
Третий столбец предыдущей строки на входе или на выходе? IOW, что произойдет, если строка будет удалена? В приведенном выше примере следует ли сравнивать 55 в третьей строке с 30 во второй строке или (поскольку вторая строка удалена в выводе) с 20 в первой строке?
 – 
NickD
14 Фев 2018 в 06:05

1 ответ

Лучший ответ
awk '$2 >= prev; {prev=$3}' file.txt

Объяснение

  • awk <commands> file.txt: запустить awk на file.txt.
  • $2 >= prev: проверьте, больше или равно ли второе поле $2 содержимому переменной prev. (Это не установлено для первой строки.) Если это верно, то awk по умолчанию печатает всю строку. (т.е. если меньше, то удалить строку.)
  • {prev=$3}: сохранить содержимое третьего поля $3 в переменной prev.

Затем это повторяется для следующей строки. awk сравнит второе поле с prev, которое теперь содержит третье поле из предыдущей строки. Несколько замечаний:

  • Я не уверен, что вы хотели для первой строки, поэтому я просто вручную включил/исключил ее по своему усмотрению.
  • Если данные на самом деле разделены табуляцией, просто добавьте следующий флаг в awk, чтобы сообщить об этом: -F'\t'.
3
Sparhawk 14 Фев 2018 в 06:16
1
Должно быть $2 > prev;: если значение меньше, строка удаляется.
 – 
NickD
14 Фев 2018 в 06:07
Упс, хороший улов. Я должен был прочитать вопрос более внимательно.
 – 
Sparhawk
14 Фев 2018 в 06:16
Спасибо @Sparhawk и @Nick. Это сработало. Хотя, когда я добавил -F'\t', он показал эту ошибку `awk: синтаксическая ошибка в исходной строке 1 awk: спасение в исходной строке 1'. Без флага он работал нормально и удалил 44 строки.
 – 
PDM
14 Фев 2018 в 06:21
Я не уверен, что это может быть. Возможно, это проблема версии; вместо этого вы можете попробовать -vFS='\t'. Если этот ответ работает, нажмите галочку слева (и стрелку вверх, если хотите). Ваше здоровье.
 – 
Sparhawk
14 Фев 2018 в 06:43
Спасибо, я так и сделал. Если я могу спросить, как awk знает, что $3 является третьим полем предыдущей строки, а не текущей?
 – 
PDM
14 Фев 2018 в 06:59