2017-02-09 2 views
0

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

400.00  1234 
400.00  2134 
400.05  4314 
400.05  9766 
401.00  9874 
401.00  7982 
402.50  1234 

Теперь я хочу, чтобы написать оболочку или AWK скрипт, который создает файл, который имеет имя, как «Timestep_401.00» и содержит только запись, относящуюся к этому значению столбца т.е. он должен содержит ....

401.00 9874 
401.00 7982 

Я пытался с помощью сценария, как показано ниже ..

awk '{ if($1=401.00) {print >> "Timestep_"$1; close($1)}}' awk.txt 

Но это обеспечивает неправильный вывод (хотя Timestep_400 файл получить создается как выход), поскольку он содержит все данные из файла. Просто значение первого столбца и всех записей из второго столбца входного файла. Содержание Timestep_400 файла

401.00  1234 
401.00  2134 
401.00  4314 
401.00  9766 
401.00  9874 
401.00  7982 
401.00  1234 

ответ

1

Похоже, что главное неправильно с вашим сценарием опечатка: = это задание, а не сравнение.

Лично я использовал сравнение строк, чтобы не думать о проблемах, связанных с значениями с плавающей запятой (и потому, что awk все равно видит поля как строки).

Я также потерял ненужный if, потому что awk-скрипты работают как condition { action }.

awk '$1 == "401.00" { print > ("Timestamp_"$1) }' awk.txt 

Я предполагаю, что вы хотите использовать > вместо >>. > означает «открыть и обрезать файл», но в последующих строках файл уже открыт, поэтому он будет добавлен. Если Timestamp_401.00 уже существует, прежде чем запускать скрипт и сохранить его содержимое, используйте >>, как вы делали.

Я предполагаю, что вы имели в виду, чтобы close файл, который вы только что написанном, но это не обязательно делать это один раз в каждой строке - по сути, это означало бы, что > вновь (и усеченный) файл каждый раз, когда блок выполняется ,

+0

Спасибо, он обеспечивает правильный выход. –