2017-02-15 2 views
1

У меня есть несколько прямолинейный AWK, используемый для целей, описанных здесь:awk работает только на скопированных данных, почему?

Append multiple header information fields to file until next header found

AWK работает только на данных после того, как я копировать/вставить его в новый файл. Если я направляю вывод головы в новый файл, awk все равно не работает, например. Awk работает только в том случае, если я копирую/вставляю файл в новый файл.

`head -40 file.csv > output.csv` 

Это AWK:

`awk -F, '/"Serial No."/ {sn = $2} 
    /"Location:"/ {loc = $2} 
    /"([0-9]{1,2}\/){2}[0-9]{4} [0-9]{2}:[0-9]{2}"/ 
        {$0 = loc FS sn FS $0}1' file.csv>master1.csv` 

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

`diff trap4_top.csv trap4_again.csv' 

:

< 1,25c1,24 

< "Serial No.","0700000036022821" 

< "Location:","LS_trap_2c" 
< "High temperature limit (�C)",20 
< "Low temperature limit (�C)",0 
< "Date - Time","Temperature (�C)" 
< "5/28/2015 08:00",24.0 
< "5/28/2015 10:00",29.5 
< "5/28/2015 12:00",28.0 
< "5/28/2015 14:00",28.5 
< "5/28/2015 16:00",27.0 
< "5/28/2015 18:00",24.5 
< "5/28/2015 20:00",23.0 
< "5/28/2015 22:00",22.5 
< "5/29/2015 00:00",21.5 
< "5/29/2015 02:00",21.0 
< "5/29/2015 04:00",20.0 
< "5/29/2015 06:00",20.0 
< "5/29/2015 08:00",24.5 
< "5/29/2015 10:00",26.0 
< "5/29/2015 12:00",27.5 
< "5/29/2015 14:00",30.0 
< "5/29/2015 16:00",29.0 
< "5/29/2015 18:00",25.5 
< "5/29/2015 20:00",23.5 
< "5/29/2015 22:00",23.0 
--- 
> "Serial No.","0700000036022821" 
> "Location:","LS_trap_2c" 
> "High temperature limit (°C)",20 
> "Low temperature limit (°C)",0 
> "Date - Time","Temperature (°C)" 
> "5/28/2015 08:00",24.0 
> "5/28/2015 10:00",29.5 
> "5/28/2015 12:00",28.0 
> "5/28/2015 14:00",28.5 
> "5/28/2015 16:00",27.0 
> "5/28/2015 18:00",24.5 
> "5/28/2015 20:00",23.0 
> "5/28/2015 22:00",22.5 
> "5/29/2015 00:00",21.5 
> "5/29/2015 02:00",21.0 
> "5/29/2015 04:00",20.0 
> "5/29/2015 06:00",20.0 
> "5/29/2015 08:00",24.5 
> "5/29/2015 10:00",26.0 
> "5/29/2015 12:00",27.5 
> "5/29/2015 14:00",30.0 
> "5/29/2015 16:00",29.0 
> "5/29/2015 18:00",25.5 
> "5/29/2015 20:00",23.5` 

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

head trap4.csv | cat -vte 

дает:

"Serial No.","0700000036022821"^M$ 
"Location:","LS_trap_2c"^M$ 
"High temperature limit (M-0C)",20^M$ 
"Low temperature limit (M-0C)",0^M$ 
"Date - Time","Temperature (M-0C)"^M$ 
"5/28/2015 08:00",24.0^M$ 
"5/28/2015 10:00",29.5^M$ 
"5/28/2015 12:00",28.0^M$ 
"5/28/2015 14:00",28.5^M$ 
"5/28/2015 16:00",27.0^M$ 
+0

Показать выход 'головки FILE.CSV | cat -vte' – anubhava

+0

Сделано. Это показывает, что я подозреваю возврат каретки – 5r9n

ответ

0

Хорошо так, как я подозревал, входной файл имеет DOS линии окончаний т.е. \r или ^M (как показано выше).

Вы должны преобразовать входной файл в окончаниях строк Unix командой:

dos2unix file.csv 

В противном случае вы можете сделать:

head -40 file.csv | sed 's/\r//' | awk ... 
+1

Большое вам спасибо. Я весь день был в тупике. – 5r9n

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