根据sort contend创建一个文件

时间:2018-05-10 19:43:08

标签: bash awk

我有超过100000条记录的列表。

每个例子,从21到84的值是连续的,那么它将是21-84但是如果它不像案例84 87那样是连续的,那么它需要被84,87分开, 在每行的开头将是值11111。

列表中的值最终将在21到80的列范围内。

每行的长度必须最多为80.

这是输入文件。

  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  87
  85
  86
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 108
 111
 109
 112
 110
 113
 115
 114
 117
 116
 118
 124
 125
 120
 122
 123
 126
 132
 127
 133
 128
 130
 131
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 148
 147
 149
 150
 151
 152
 153
 154
 155
 156
 158
 157
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 184
 183
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 214

这里是所需的输出文件。

111111              21-84,87,85-86,88-106,108,111,109,112,110,113,115,114,117,
111111              116,118,124-125,120,122-123,126,132,127,133,128,130-131,
111111              135-146,148,147,149-156,158,157,159-182,184,183,185-212,214,

提前致谢

1 个答案:

答案 0 :(得分:3)

提供没有解释:检查手册页中的所用命令,然后回答问题:

awk '
    function printrange() { print start (start == last ? "" : "-" last) }
    NR == 1 {start=last=$1; next} 
    $1 == last+1 {last=$1; next} 
    {printrange(); start=last=$1}
    END {printrange()}
' file | paste -sd" " | fold -sw 60 | tr ' ' ',' | sed 's/^/111111              /'
111111              21-84,87,85-86,88-106,108,111,109,112,110,113,115,114,117,
111111              116,118,124-125,120,122-123,126,132,127,133,128,130-131,
111111              135-146,148,147,149-156,158,157,159-182,184,183,185-212,214