Вы можете сделать это с помощью набора утилит. Надеюсь, я правильно понял ... и если это так, то это может сработать. Если нет, укажите, где я ошибся в предположении :-) Для этого необходимо, чтобы число полей на запись CSV было фиксированным (это также очень простой пример, который не охватывает различные варианты CSV (например, привет, " Мир, как ", вы бы разбить как" мир, как "будет разделен на два поля)):
hello,world,how,are,you
one,two,three,four,five
once,I,caught,a
fish,alive
hey,now,hey,now,now
И этот скрипт awk:
BEGIN {
FS=","
fields=0
}
{
if (line == "") {
fields=NF
line = $0
} else {
fields=fields + (NF - 1)
line=line"|"$0
}
}
fields == 5 {
print line
fields = 0
line = ""
}
Выполнение этого:
awk -f join.awk < infile | sort | tr '|' '\n'
дает этот вывод:
hello,world,how,are,you
hey,now,hey,now,now
once,I,caught,a
fish,alive
one,two,three,four,five
По сути, все, что мы делаем со сценарием awk, это объединение многострочных записей в одну строку, которую мы затем можем передать в sort
, а затем снова разбить с помощью tr
. Я использую канал в качестве замены символа новой строки - просто выберите то, что вы можете гарантировать, не будет отображаться в записи CSV.
Теперь это может быть не идеально для того, что вы хотите, но, надеюсь, это подтолкнет вас в правильном направлении. Главное, что я написал в скрипте awk, - это то, что ему нужно знать, сколько полей в записи CSV. Это должно быть исправлено. Если это переменная, то все ставки отключены, так как там должно быть больше правил, которые определяют семантическую природу файла, который вы хотите отсортировать ...