Awk зацикливание в условиях - PullRequest
0 голосов
/ 14 декабря 2018

Мне нужно создать условие, которое разделяет данные по десятилетиям.Первый столбец - это значение года (начиная с 0).Как изменить условие в запросе awk?

0 Jan 10 2:04:40 Tot D
0 Jul 05 11:33:06 Tot A
3 May 04 22:22:05 Tot A
3 Oct 29 1:32:40 Tot D
7 Feb 20 23:03:27 Tot A
7 Aug 17 5:58:18 Tot D
10 Dec 10 6:28:52 Tot A
11 Jun 04 15:36:12 Tot D
14 Apr 04 4:41:23 Tot D
14 Sep 27 7:18:39 Tot A
18 Jan 20 10:38:27 Tot D
18 Jul 16 18:04:17 Tot A
21 May 15 5:47:44 Tot A
21 Nov 08 9:27:47 Tot D
22 May 04 23:00:32 Tot A
25 Mar 03 6:19:48 Tot A
25 Aug 27 13:47:51 Tot D
28 Dec 20 15:07:37 Tot A
29 Jun 14 22:37:10 Tot D
32 Apr 14 11:56:36 Tot D
32 Oct 07 15:38:15 Tot A
36 Jan 31 19:07:10 Tot D
36 Jul 27 0:39:47 Tot A
39 May 26 13:13:25 Tot A
39 Nov 19 17:26:37 Tot D
40 May 15 6:26:43 Tot A

Мне нужно представить данные следующим образом:

awk '{if ($1 >= 0 && $1 < 10) print }' All_Lunar_Eclipse.txt 
0 Jan 10 2:04:40 Tot D
0 Jul 05 11:33:06 Tot A
3 May 04 22:22:05 Tot A
3 Oct 29 1:32:40 Tot D
7 Feb 20 23:03:27 Tot A
7 Aug 17 5:58:18 Tot D

Но мне придется делать это вручную каждые 10 лет..

awk '{if ($1 >= 10 && $1 < 20) print }' All_Lunar_Eclipse.txt

10 Dec 10 6:28:52 Tot A
11 Jun 04 15:36:12 Tot D
14 Apr 04 4:41:23 Tot D
14 Sep 27 7:18:39 Tot A
18 Jan 20 10:38:27 Tot D
18 Jul 16 18:04:17 Tot A

Я пробовал что-то похожее на следующее без радости.

awk 'BEGIN { for (i = 0; i <= 2019; +=10) print i }'

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018
$ awk '
int(p/10)!=int($1/10) {
    print "New decade begins:"
}
{ p=$1 }
1' file
0 Jan 10 2:04:40 Tot D
0 Jul 05 11:33:06 Tot A
3 May 04 22:22:05 Tot A
3 Oct 29 1:32:40 Tot D
7 Feb 20 23:03:27 Tot A
7 Aug 17 5:58:18 Tot D
New decade begins:
10 Dec 10 6:28:52 Tot A
11 Jun 04 15:36:12 Tot D
...

... по вашему определению десятилетия (if ($1 >= 10 && $1 < 20)).Я бы предположил, что годы 1-10 - это первое десятилетие, 11-20 - второе и т. Д. Однако не проверял.Это тоже усложнило бы суммирование.

0 голосов
/ 14 декабря 2018

Зависит от того, что вы хотите, но используйте первую строку в качестве информации, разделив на 10 и поймав целочисленное значение

awk '
   # separator process
   { Decade = int( $1 / 10 ) }

   # apply sample (unsorted and just stored by decade)
   { Data[ Decade] = Data[Decade] "\n" $0 }
   END { for ( Dec in Data ) printf "--- Decade: %d ----\n%s\n", Dec, Data[ Dec] }
   ' YourFile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...