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

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

  • пробел во времени, вызывающий проблему при формировании html-файла в скрипте
  • Как обращаться с акцентами с текстом?
  • Влияние изменений GUID и таблиц разделов на данные
  • Как показать только последние две цифры числа в LibreOffice Calc?
  • сортировать, но держать строку заголовка вверху
  • Как поддерживать (верхнюю) строку, видимую при прокрутке?
  • в каком порядке анализируется таблица маршрутов?
  • Каковы различия между различными таблицами разделов?
  • 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>

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