【问题标题】:awk only works on copied data, why?awk 仅适用于复制的数据,为什么?
【发布时间】:2017-02-15 15:24:39
【问题描述】:

我有一个有点简单的 awk 用于此处描述的目的:

Append multiple header information fields to file until next header found

awk 仅在我将数据复制/粘贴到新文件后才对数据起作用。例如,如果我将 head 的输出定向到新文件中,则 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`

我在 diff 中看到了特殊字符,但我没有看到它们是否涉及,或者如何删除它们,除了到目前为止的复制/粘贴。

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$

【问题讨论】:

  • 显示head file.csv | cat -vte的输出
  • 完成。它表明我怀疑是回车

标签: bash awk special-characters copy-paste


【解决方案1】:

好吧,我怀疑你的输入文件有 DOS 行结尾,即 \r^M(如上所示)。

您应该通过运行将输入文件转换为 unix 行结尾:

dos2unix file.csv

否则你可以这样做:

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

【讨论】:

  • 非常感谢。我整天都被这件事难住了。
猜你喜欢
  • 2019-08-18
  • 2022-08-19
  • 2016-09-09
  • 2021-09-29
  • 2011-10-18
  • 2013-05-27
  • 2015-10-07
  • 1970-01-01
相关资源
最近更新 更多