2015-10-12 2 views
0

Я должен извлечь около 50 тыс. Столбцов из файла, содержащего 150 тыс. Столбцов. Я попробовал cut. Но cut поддерживают только столбцы 22354.Извлечение столбцов из файла (более 22354 столбцов)

Номера столбцов находятся в файле, и я должен извлечь эти столбцы из основного файла.

Файл выглядеть следующим образом:

.001 .2 0 0 1 2.3456 
    1 2 4.567 2.12 0 7 
    1 2 1 2 0 1 

Срез работа, но только для первого 22354.

cut -d" " -f2,4 # У меня есть 50k номера, чтобы поставить после f.

Можно три раза вырезать файл и вставить их вместе! Я ищу лучший способ.

+0

Любой образец данных? – sat

+0

Что означает содержание файла? – luoluo

+0

'awk' и' perl', похоже, с легкостью обрабатывают такое большое количество столбцов. Вы еще что-нибудь пробовали с 'awk'? – srvsh

ответ

1
awk -v "LastCol=50000" '{ 
    if (NF > LastCol){ 
     for(i = 1; i < LastCol; i++) printf "%s%s", $i, FS 
     print $LastCol 
     } 
    else print 
    }' File > File.crop 

Испытано с 150K колонке (seq -s " " 150000) и работает здесь

1

Чтобы обойти любые ограничения на длину командной строки (а также каких-либо ограничений нарезанных), вы можете сделать это с awk -f вместо этого. Поместите свой список столбцов в файле:

columnfile: 
{print [comma-separated list of your column numbers each preceded by "$"]} 

Тогда просто:

awk -f columnfile < [your input file] 
+0

??? проблема заключается в ограничении 'cut', а не awk и написании командной строки, где столбец 50K, которому предшествует' $ ', не часто встречается в коде. – NeronLeVelu

+0

Впервые awk закончил память! – user1436187

+1

В моей системе 'awk' действительно' mawk 1.3', и я получаю: 'awk: предел программы превышен: максимальное количество полей size = 32767' –

0

Вы можете использовать sed, я не уверен, что его пределы, но sed может обрабатывать 150000 столбцы легко и быстро. В первом проходе переключите все разделители полей на новые строки для sed, затем используйте параметр -n для подавления вывода и укажите диапазоны столбцов командой печати sedp.

E.g. seq -s " " 150000 > myfile.txt

sed -r 's/[ ]+/ /g;s/ /\n/g' myfile.txt | sed -n '55455,60000p;115000,125000p'

Note: Не забудьте сделать ваши колонки математику, так как теперь столбцы строки, вам нужно умножить прежние номера строк по количеству столбцов.

Смежные вопросы