разделить файл на несколько небольших файлов по столбцам

У меня есть файл данных, который может содержать N строк, и каждая строка состоит из M элементов, разделенных пробелом. В настоящее время я хочу разделить каждую строку на несколько сегментов. Другими словами, предположим, что число сегментов равно 3; то исходный файл будет разделен на 3 файла, каждый из которых имеет N строк, и каждая строка содержит элементы M / 3. Помимо написания программ на C ++ или Java, есть ли эффективный подход, который может выполнить эту задачу в Unix / Linux?

  • Цветной вывод с датчиков
  • Calc: Как преобразовать числовой столбец на место?
  • Удалить все до «/» на каждой строке
  • Трубы, как поток данных в трубопроводе?
  • вставить и сохранить результат в 1-й аргумент без использования временных файлов
  • Как я могу правильно обосновать выход переменной длины?
  • Обертывание предложений в столбцы
  • Увеличение даты в файле
  • Как ТОЛЬКО распечатать номер, который создается из du -sh / home?
  • как добавить вывод в виде нового столбца с именами файлов
  • вырезать столбец 2 из текстового файла
  • как сортировать по дням недели?
  • 4 Solutions collect form web for “разделить файл на несколько небольших файлов по столбцам”

    Это обслуживает переменное количество полей в одном файле, а последний сегмент заполняется только частично, т.е. меньше полей, чем указано (для каждого сегмента).
    Обратите внимание, что если число полей в строке приводит к меньшему количеству сегментов, чем указано, в выходной файл для этих сегментов дефицита ничего не записывается.

    awk -v 'ncol=5' -v 'pfix=file' '{ fldn = 0 sfix = 1 segs = NF/ncol # round up if number of field is not evenly divisible by number of columns segs = (segs == int(segs)) ?segs :int(segs)+1 while (fldn != NF) { fmod = (++fldn) % ncol printf "%s%s", dlim, $(fldn) >> pfix sfix if (fmod == 1 ) { dlim = " " } if ((fmod==0 ) || (fldn==NF)) { printf "\n" >> pfix sfix dlim = ""; sfix++ } } }' infile 

    Это то, что вы ищите?

     awk '{ print $1 $2 $3 > file1; print $4 $5 $6 > file2; print $7 $8 $9 > file3 }' originalfile 

    Или вы хотите что-то более общее?

     awk -v 'n=3' -v 'prefix=pref' '{ for (i = 0; i < n; i++) { for (j = 0; j < NF / n; j++) { printf("%s ", $(i + j + 1)) > prefix i } printf("\n") > prefix i } }' originalfile 

    Примечание: это зависит от предположения, что все строки имеют одинаковое количество столбцов.

    Если ваш файл чист, я бы посоветовал использовать стандартное приложение

    cut имеет три флага, которые вы должны знать по крайней мере

    • -d для определения разделителя (TAB является значением по умолчанию
    • -f, чтобы выбрать поле
    • -c, чтобы выбрать диапазон символов

    Вы можете либо использовать комбинацию -d -f, либо -c. Если ваш файл не ограничен TAB, но прекрасно разделен пространством, вы можете сделать

     cut -d' ' -f1-3 

    для выбора первых трех столбцов.

    Если вы хотите выбрать четвертый столбец, находящийся между символами 25 и 36, вы можете сделать

     cut -c25-36 

    sep_file.ksh

     #!/bin/ksh FILENAME=$1 SEG=$2 SEG_NO=1 while [[ $SEG_NO -le $SEG ]] do awk '{CL=NF/'"$SEG"';CL=(CL==int(CL)?CL:int(CL)+1);LS=(('"$SEG_NO"'-1)*CL)+1;LE=LS+CL-1;if(LE>NF)LE=NF;for(i=LS;i<=LE;i++)printf("%s ",$i);printf("\n")}' $FILENAME > ${FILENAME}_$SEG_NO SEG_NO=`echo "$SEG_NO + 1"|bc` done 

    Использование: ./sep_file.ksh <file_name_to_read> <no_of_segments>

    Linux и Unix - лучшая ОС в мире.