2015-03-10 2 views
0

Я пришел к разочаровывающему концу, пытаясь понять, как изменить форматирование файла с помощью sed, tr и т. Д. Я уверен, что есть правильный ответ, чтобы делать то, что я хочу сделать, Я просто не знаю, что это.Разделите абзацы при удалении пробелов

Вот моя проблема. У меня есть файл данных, который выглядит так:

8587 812.700 152.791 12.7410 0.0372 99.9999 9.9999 12.2520 0.0436 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 
          99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 
          99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 13.1942 0.0589 99.9999 9.9999 99.9999 9.9999 
          99.9999 9.9999 12.9601 0.1323 99.9999 9.9999 1.0337 0.3166 

И я хочу превратить его в одну строку. В каждом файле содержится около 10 000 этих блоков. Я думаю, что я хочу вырезать символы новой строки, за которыми следуют 26 пробелов, которые будут выполнять эту работу и оставить новую строку на месте для следующего блока.

Итак, есть ли какие-либо удобные инструменты для Linux, доступные для этого?

Благодаря

+0

вы пробовали что-нибудь до сих пор? – Mehraban

ответ

0

Это сокращает символ новой строки, если ее следует 26 пространств:

awk '{printf "%s",(/^       /?$0:RS $0)}' file 

Вы хотите также удалить 26 пространства?

awk '{printf "%s",(/^       /?$0:RS $0)}' file | awk '{gsub(/       /,"")}1' 
    8587 812.700 152.791 12.7410 0.0372 99.9999 9.9999 12.2520 0.0436 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 13.1942 0.0589 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 12.9601 0.1323 99.9999 9.9999 1.0337 0.3166 

Другой пример:
Удалить новую строку и 6 пространство, если следующая строка начинается с 6 мест.

cat file 
data here 
     more data 
     not here 
but this is new line 
so i this 

Вот все в один awk, не давая пустую строку в верхней части, и правильное окончание.

awk '{split($0,a,"  ")} NR==1 {a[2]=$0} {printf "%s",(/^  /||NR==1?a[2]:RS $0)}END{print ""}' file 
data here more data not here 
but this is new line 
so i this 

Переписан код:

awk '{printf "%s",(gsub(/ {5}/,"")||NR==1?$0:RS $0)} END {print ""}' file 
data here more data not here 
but this is new line 
so i this 

если {5} (количество мест) не работает, попробуйте добавить --re-interval к вашей команде awk, или просто использовать количество пробелов, что вам нужно.

+0

Вы можете использовать '/^{26} /' для соответствия 26 пробелам в начале строки. –

+0

@JonathanLeffler Правда, но не для 'gnu awk'' 3.x', где вам нужно добавить опцию' --re-interval' или '--posix' – Jotne

+0

Великолепный. Второй вариант - удаление пробелов - именно то, что мне нужно. Путь быстрее и проще, чем код fortran, с которым я клонился. – npaust

0

С GNU AWK для мульти-гольцов RS:

$ gawk -vRS='^$' -vORS= '{gsub(/\n {26}/,"")}1' file 
    8587 812.700 152.791 12.7410 0.0372 99.9999 9.9999 12.2520 0.0436 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 13.1942 0.0589 99.9999 9.9999 99.9999 9.9999 99.9999 9.9999 12.9601 0.1323 99.9999 9.9999 1.0337 0.3166 
Смежные вопросы