sed переместить текст в .txt на следующую строку - PullRequest
0 голосов
/ 13 февраля 2012

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

EMPIRE,STATE,BLDG,CO,494202320000008,336,5,AVE,ENT,NEW,YORK,NY,10003,N,3/1/2012,TensionCode,VariableICAP,PFJICAP,Residential,%LBMPZone,L,9,146.0,,,10715.0956,,,--,,0,,,J,TripNumber,ServiceClass,PreviousAccountNumber,MinMonthlyDemand,TODCode,Profile,Tax,Muni,41,39,00000000000000,9952,54,Y,Non-Taxable,--,FromDate,ToDate,Use,Demand,BillAmt,12/29/2011,1/31/2012,4122520,6,936.00,$293,237.54

то, что я хотел бы видеть, это данные, уложенные в стопу

- EMPIRE STATE BLDG CO
- 494202320000008
- 336 5 AVE ENT
- NEW YORK NY

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

- From Date  ToDate    use     Demand   BillAmt
- 12/29/2011 1/31/2012 4122520 6,936.00 $293,237.54.

Я использую cygwin на компьютере с Windows XP. Заранее благодарю за любую помощь.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Для получения последней строки в отдельном файле:

echo -e "From Date\tToDate\tuse\tDemand\tBillAmt" > lastlinefile.txt
cat originalfile.txt | sed 's/,FromDate/~Fromdate/' | awk -v FS="~" '{print $2}' | sed 's/FromDate,ToDate,use,Demand,BillAmt,//' | sed 's/,/\t/' >> lastlinefile.txt

В остальном:

cat originalfile.txt | sed -r 's/,Fromdate[^\n]+//' | sed 's/,/\n/' | sed -r 's/$/\n\n' > nocommas.txt

Ваш пробег может отличаться, если говорить о первом '\ n'во второй команде.Если он не работает должным образом, замените его пробелом (при условии, что в ваших данных нет пробелов).

Или, если хотите, сценарий оболочки для работы с файлом и разделения его:

#!/bin/bash
if [ -z "$1" ]
then echo "Usage: $0 filename.txt; exit; fi

echo -e "From Date\tToDate\tuse\tDemand\tBillAmt" > "$1_lastline.txt"
cat "$1" | sed 's/,FromDate/~Fromdate/' | awk -v FS="~" '{print $2}' | sed 's/FromDate,ToDate,use,Demand,BillAmt,//' | sed 's/,/\t/' >> "$1_lastline.txt"

cat "$1" | sed -r 's/,Fromdate[^\n]+//' | sed 's/,/\n/' | sed -r 's/$/\n\n' > "$1_fixed.txt"

Просто вставьте его в файл и запустите.Прошло много лет с тех пор, как я использовал Cygwin ... возможно, вам придется chmod +x file сначала.

1 голос
/ 13 февраля 2012

Я даю вам два ответа в зависимости от того, как вы хотели файл.Предыдущий ответ разделил его на два файла, этот хранит все в одном файле в формате:

EMPIRE
STATE
BLDG
CO
494202320000008
336
5
AVE
ENT
NEW
YORK
NY
From Date  ToDate    use     Demand   BillAmt
12/29/2011 1/31/2012 4122520 6,936.00 $293,237.54.

Это лучшее, что я могу сделать с разделителями, которые вы установили на месте.Если бы вы оставили что-то вроде «EMPIRE STATE BUILDING CO, 494202320000008,336 5 AVE ENT, NEW YORK, NY», было бы намного проще.файл и запустить его из Cygwin: ./filename.sh

...