2014-11-04 2 views
1

Я пытаюсь разделить очень длинный текстовый файл, который выглядит следующим образом:Split текстового файла и переименовать на основе первого столбца

AA1 0.1 0.2 0.3 
AA2 0.5 0.6 0.7 
AA3 0.5 0.1 0.3 

Я хочу, чтобы сохранить каждую строку в одном отдельном текстовом файле. Я знаю, что команда split сделает это, а также следующую команду awk: awk '{filename = FILENAME NR; print> имя_файла; закрыть (имя файла)}»

НО Я хотел бы каждый следующий файл, который будет назван в честь первой колонке, как это:

AA1.txt 
AA2.txt 
AA3.txt 

Есть ли простой способ сделать это?

Благодаря

ответ

0

с использованием AWK

если вы не хотите 1-й столбец

awk '{cmd="echo " $2" "$3" "$4 ">" $1 ;system(cmd)}' file 
+0

Зачем вы запускаете внешний процесс для эха? Вы можете просто использовать '{print $ 0> имя_файла}' - как ранее указывали другие ответы. Вы дали пример того, как это должно быть сделано ** не **! – hek2mgl

+0

Нет способа сделать это – Hackaholic

+0

Да, но почему вы предложили худшие из них?Также это уязвимо против инъекции кода оболочки (для нулевого значения). Создание динамического кода - это всегда то, с чем нужно обращаться с осторожностью, и я не вижу причин, почему его следует использовать здесь. – hek2mgl

2

Вы можете использовать очень простой AWK сценария как

awk '{print $0 > $1".txt"}' inputFile

будет создает файлы

AA1       
AA2       
AA3 

Тестовые

$ ls AA* 
AA1 AA2 AA3 

$ cat AA1 
AA1 0.1 0.2 0.3 
$ cat AA2 
AA2 0.5 0.6 0.7 
$ cat AA3 
AA3 0.5 0.1 0.3 
+0

он должен быть $ 1. "Txt", я не буду работать, если вы не используете котировки – bapors

+0

@bapors Спасибо за указание. Исправлено в ответ. – nu11p01n73R

2

Вы можете использовать это:

awk '{print >> $1".txt"; close($1".txt")}' input.txt 

Он использует значение первого столбца ($1) плюс расширение «.txt» в качестве имени выходного файла для текущей строки.

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


Если вы хотите, чтобы пропустить первый столбец в выходной - как это не изменится - вы можете использовать это:

awk '{for(i=2;i<=NF;i++){printf "%s ", $i >> $1".txt"};printf "\n" >> $1".txt"; close($1".txt")}' input.txt 

Он перебирает каждую колонку, начиная с второй и, наконец, добавляет новый линия.

2

Вы можете использовать следующие либо pipeing ввода текста в AWK или с помощью входного файла в качестве параметра с AWK

cat test.txt | awk '{ print $0 > $1.txt }' 

или

awk '{ print $0 > $1.txt }' test.txt 
Смежные вопросы