проверить значение 1 в столбце 1 и значение 4 в столбце 4 и напечатать всю строку, bash

У меня есть файл data.txt.

    1   2    3     4       5       6       7
    cat data.txt
1   10 100 1100 10.0000 10.1122 60.0000 60.1111 
2   11 110 1110 10.1122 10.3333 60.1111 61.3333
3   12 120 1120 10.3333 11.0547 61.3333 61.9999
4   13 130 1130 11.0547 11.1111 61.9999 62.4444
5   14 140 1140 11.1111 10.1122 62.4444 62.8888
6   15 150 1150 10.1122 10.3333 61.3333 61.9999 
7   16 160 1160 10.3333 11.1111 60.1111 61.3333
8   17 170 1170 11.0547 11.5555 61.3333 64.1111
9   18 180 1180 10.3333 11.1111 61.3333 61.3333
10  19 190 1190 11.0547 11.5555 60.1111 64.1111
11  20 200 1200 11.1111 10.1122 62.4444 62.8888

Я хотел найти все значения последовательно от 10.1122 в column 4 до 11.1111. И значения последовательно от 60.1111 в column 6 до 61.9999.

'anubhava' и 'kent' предложили (спасибо!) использовать

awk -v col=4 -v start=10.1122 -v end=11.1111 '$col>=start && $col<=end{ print $col}' data.txt | sort -nu

   1  10.1122 
   2  10.3333
   3  11.0547
   4  11.1111

awk -v col=6 -v start=60.1111 -v end=61.9999 '$col>=start && $col<=end{ print $col}' data.txt | sort -nu

   1  60.1111 
   2  61.3333
   3  61.9999

Я хочу распечатать/сохранить в файле results.txt строки, в которых

col4: 10.1122 && col6: 60.1111
col4: 10.3333 && col6: 60.1111
col4: 11.0547 && col6: 60.1111
col4: 10.1122 && col6: 61.3333
col4: 10.3333 && col6: 61.3333
col4: 11.0547 && col6: 61.3333

означает строки -->

2   11 110 1110 10.1122 10.3333 60.1111 61.3333
6   15 150 1150 10.1122 10.3333 61.3333 61.9999 
7   16 160 1160 10.3333 11.1111 60.1111 61.3333
8   17 170 1170 11.0547 11.5555 61.3333 64.1111
9   18 180 1180 10.3333 11.1111 61.3333 61.3333
10  19 190 1190 11.0547 11.5555 60.1111 64.1111

Любое предложение? Вот почему я ожидал, что результаты awk будут храниться в массивах array1 и array2, чтобы можно было найти строки, в которых существуют значения col4 и col6.

Спасибо.


person user3652962    schedule 24.05.2014    source источник
comment
Ваш вопрос слишком запутанный. Пожалуйста, отредактируйте, чтобы это было более очевидно.   -  person glenn jackman    schedule 25.05.2014
comment
почему строка № 3 № 4 ... не в результате?   -  person Kent    schedule 25.05.2014
comment
Потому что line #3 и line #9 одинаковы. Он должен печатать только одно свидетельство того, что col4: 10.3333 && col6: 61.3333 Line #4 имеет col4: 11.0547 && col6: 61.9999. Мне просто нужны пары до предпоследних значений из обоих столбцов, 4 и 6.   -  person user3652962    schedule 25.05.2014


Ответы (1)


эта строка должна делать:

awk -v f4=10.1122 -v t4=11.1111 -v f6=60.1111 -v t6=61.9999 
      '$4>=f4&&$4<=t4&&$6>=f6&&$6<=t6' file

результат:

11 110 1110 10.1122 10.3333 60.1111 61.3333
12 120 1120 10.3333 11.0547 61.3333 61.9999
13 130 1130 11.0547 11.1111 61.9999 62.4444
15 150 1150 10.1122 10.3333 61.3333 61.9999 
16 160 1160 10.3333 11.1111 60.1111 61.3333
17 170 1170 11.0547 11.5555 61.3333 64.1111
18 180 1180 10.3333 11.1111 61.3333 61.3333
19 190 1190 11.0547 11.5555 60.1111 64.1111

обратите внимание, что с определенными вами критериями: строка, начинающаяся с 12 and 13, также должна быть в выводе.

Кроме того, номера строк добавлены вами, но не в файле, верно? в противном случае столбец4 будет столбцом5... поэтому я просто удалил столбец с номером первой строки.

person Kent    schedule 24.05.2014
comment
Спасибо, Кент. Оно работает! Я отредактировал часть '$4>=f4&&$4<t4&&$6>=f6&&$6<t6', так как не хочу сопоставлять последние значения как из col4, так и из col6. Но проблема в том, что он также печатает строки, в которых есть более одного экземпляра col4:val4&&col6:val6. Любое предложение, чтобы избежать этого? - person user3652962; 25.05.2014