2015-03-20 2 views
0

Я хотел разбить большой файл (185 миллионов записей) на несколько файлов на основе одного значения столбца. Файл - .dat-файл, а разделитель, используемый между столбцами, - это^A (\ u0001).Сплит большого файла на основе значения столбца - linux

Содержание файла выглядит так:

194^A1^A091502^APR^AKIMBERLY^APO83^A^A^A^A0183^AUSA^A^A^A^A^A^A^A^A 
194^A1^A091502^APR^AJOHN^APO83^A^A^A^A0183^AUSA^A^A^A^A^A^A^A^A 
194^A^A091502^APR^AASHLEY^APO83^A^A^A^A0183^AUSA^A^A^A^A^A^A^A^A 
194^A3^A091502^APR^APETER^APO83^A^A^A^A0183^AUSA^A^A^A^A^A^A^A^A 
194^A4^A091502^APR^AJOE^APO83^A^A^A^A0183^AUSA^A^A^A^A^A^A^A^A 

Теперь я хотел бы разделить файл на основе второго значения столбца, если вы видите третью строку второго значение столбца пусто, так что все пустые строки должны Приходите один файл, остальные должны иметь один файл.

Пожалуйста, помогите мне в этом. Я попробовал google, кажется, мы должны использовать awk для этого.

С уважением, Шанкар

ответ

0

С AWK:

awk -F '\x01' '$2 == "" { print > "empty.dat"; next } { print > "normal.dat" }' filename 

Имена файлов могут быть выбраны произвольно, конечно. print > "file" печатает текущую запись в файл с именем "file".

Addendum re: comment: Удаление колонны немного сложнее, но, безусловно, возможно. Я хотел бы использовать

awk -F '\x01' 'BEGIN { OFS = FS } { fname = $2 == "" ? "empty.dat" : "normal.dat"; for(i = 2; i < NF; ++i) $i = $(i + 1); --NF; print > fname }' filename 

Это работает следующим образом:

BEGIN {           # output field separator is 
    OFS = FS          # the same as input field 
               # separator, so that the 
               # rebuilt lines are formatted 
               # just like they came in 
} 
{ 
    fname = $2 == "" ? "empty.dat" : "normal.dat" # choose file name 

    for(i = 2; i < NF; ++i) {      # set all fields after the 
    $i = $(i + 1)        # second back one position 
    } 

    --NF           # let awk know the last field 
               # is not needed in the output 

    print > fname         # then print to file. 
} 
+1

'AWK -F '\ x01'«{печать> ($ 2 == "пустой"? "": "Нормальный")» .dat "} '' –

+0

Это тоже сработает, но я не думаю, что это яснее. YMMV. – Wintermute

+0

Собирался публиковать как ответ, но он был слишком похож на ваш, поэтому я думал, что просто добавлю в качестве альтернативы комментарии :) –