Разделить упорядоченный файл в Linux

У меня есть большой файл с разделителями (с трубой '|' в качестве разделителя), который мне удалось отсортировать (используя сортировку linux) в соответствии с первым (числовым), вторым (числовым) и четвертым столбцом (порядок строк, поскольку это значение метки времени ). Файл такой:

77|141|243848|2014-01-10 20:06:15.722|2.5|1389391203399
77|141|243849|2014-01-10 20:06:18.222|2.695|1389391203399
77|141|243850|2014-01-10 20:06:20.917|3.083|1389391203399
77|171|28563|2014-01-10 07:08:56|2.941|1389344702735
77|171|28564|2014-01-10 07:08:58.941|4.556|1389344702735
77|171|28565|2014-01-10 07:09:03.497|5.671|1389344702735
78|115|28565|2014-01-10 07:09:03.497|5.671|1389344702735

Мне было интересно, есть ли простой способ разделить этот файл на несколько текстовых файлов с одним вкладышем awk, sed, grep или perl всякий раз, когда изменяется значение первого столбца или второго столбца. Конечным результатом для примера файла должно быть 3 текстовых файла, подобных этому:

77|141|243848|2014-01-10 20:06:15.722|2.5|1389391203399
77|141|243849|2014-01-10 20:06:18.222|2.695|1389391203399
77|141|243850|2014-01-10 20:06:20.917|3.083|1389391203399

77|171|28563|2014-01-10 07:08:56|2.941|1389344702735
77|171|28564|2014-01-10 07:08:58.941|4.556|1389344702735
77|171|28565|2014-01-10 07:09:03.497|5.671|1389344702735

78|115|28565|2014-01-10 07:09:03.497|5.671|1389344702735

Я мог бы сделать это на Java, конечно, но я думаю, что это было бы излишеством, если бы это можно было сделать с помощью скрипта. Кроме того, возможно ли, что созданные имена файлов используют значения этих двух столбцов, что-то вроде 77_141.txt для первого файла, 77_171.txt для второго файла и 78_115.txt для третьего?


person Alexandros    schedule 14.01.2014    source источник


Ответы (1)


awk очень удобен для такого рода проблем. Это может быть подход:

awk -F"|" '{print >> $1"_"$2".txt"}' file

Объяснение

  • -F"|" устанавливает разделитель полей как |.
  • {print > something} печатает строки в файл something.
  • $1"_"$2".txt" вместо something установите выходной файл как $1"_"$2, будучи $1 первым полем, основанным на разделителе |. То есть 77, 78... И то же самое для $2, будучи 141, 171...
person fedorqui 'SO stop harming'    schedule 14.01.2014
comment
Спасибо @devnull, вы правы, я хотел добавить >> вместо >! - person fedorqui 'SO stop harming'; 14.01.2014
comment
Превосходно. +1 и принял ваш ответ. Спасибо вам обоим за беспокойство. - person Alexandros; 14.01.2014
comment
@BMW во многих случаях достаточно. Но если у вас уже есть файлы и вы хотите добавить данные, > сначала урежет, а затем добавит содержимое. Вместо этого >> добавит данные после предыдущего. - person fedorqui 'SO stop harming'; 15.01.2014
comment
Что ты имеешь в виду, @BMW? Не могу понять причину. - person fedorqui 'SO stop harming'; 15.01.2014