String 如何从awk中提取特定字符串的最后一个字符并将其附加到列中?

String 如何从awk中提取特定字符串的最后一个字符并将其附加到列中?,string,bash,parsing,awk,String,Bash,Parsing,Awk,我有许多数据文件,看起来像这样: ,8/9/2015 时区-6 , 序列号1900000395CCE41 位置:,LS\U陷阱\U 9u 高温极限(�C) ,20.12 低温极限(�C) ,0.05 日期、时间、温度(�(C) 5/28/2015 6:00,20 5/28/2015 8:00,22.6 5/28/2015 10:00,27.1 5/28/2015 12:00,26.1 5/28/2015 14:00,27.1 5/28/2015 16:00,26.1 5/28/2015 18:

我有许多数据文件,看起来像这样:

,8/9/2015
时区-6
,
序列号1900000395CCE41
位置:,LS\U陷阱\U 9u
高温极限(�C) ,20.12
低温极限(�C) ,0.05
日期、时间、温度(�(C)
5/28/2015 6:00,20
5/28/2015 8:00,22.6
5/28/2015 10:00,27.1
5/28/2015 12:00,26.1
5/28/2015 14:00,27.1
5/28/2015 16:00,26.1
5/28/2015 18:00,24.6
5/28/2015 20:00,23.6
5/28/2015 22:00,22.6
5/29/2015 0:00,22.1
我使用以下脚本解析这些文件:

awk -vFS=, -vOFS=, \
   '{gsub("\"","")}
    FNR==4{s=$2}
    FNR==5{l=$2}
    FNR>8{gsub(" ",OFS);print l,s,FILENAME,$0}' \
   *.csv > formatted_log.csv
printf "\nDone\n"
我想从'loc'字符串(在本例中为'u')中提取最后一个字符,并将其附加到另一列

最终的文件应如下所示:

LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,u,5/28/2015,5:59,20.1
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,u,5/28/2015,7:59,27.6
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,u,5/28/2015,9:59,30.1
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,u,5/28/2015,11:59,29.6
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,u,5/28/2015,13:59,29.6
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,u,5/28/2015,15:59,28.1
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,u,5/28/2015,17:59,26.1
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,u,5/28/2015,19:59,23.6
到目前为止,我的尝试如下:

awk -vFS=, -vOFS=, \
   '{gsub("\"","")}
    FNR==4{ser=$2}
    FNR==5{loc=$2}
    FNR>8{gsub(" ",OFS);print loc,ser,FILENAME,${loc:(-1)},$0}' \
   *.csv > formatted_log.csv
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,5:59,20.1
5/28/2015 7:59,27.6
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,7:59,27.6
5/28/2015 9:59,30.1
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,9:59,30.1
5/28/2015 11:59,29.6
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,11:59,29.6
5/28/2015 13:59,29.6
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,13:59,29.6
5/28/2015 15:59,28.1
我得到以下错误:

awk: cmd. line:4:     FNR>8{gsub(" ",OFS);print loc,ser,FILENAME,${loc:(-1)},$0}
awk: cmd. line:4:                                                 ^ syntax error
awk: cmd. line:4:     FNR>8{gsub(" ",OFS);print loc,ser,FILENAME,${loc:(-1)},$0}
awk: cmd. line:4:                                                           ^ syntax error
awk: cmd. line:4:     FNR>8{gsub(" ",OFS);print loc,ser,FILENAME,${loc:(-1)},$0}
awk: cmd. line:4:                                                              ^ syntax error
将脚本更改为:

    awk -vFS=, -vOFS=, \
       awk -vFS=, -vOFS=, \
   '{gsub("\"","")}
    FNR==4{ser=$2}
    FNR==5{loc=$2}
  my_loc="${loc:(-1)}"
    FNR>8{gsub(" ",OFS);print loc,ser,FILENAME,my_loc,$0}' \
   *.csv > formatted_log.CSV
printf "\nDone1\n"
awk -vFS=, -vOFS=, \
   '{gsub("\"","")}
    FNR==4{ser=$2}
    FNR==5{loc=$2}
  my_loc="${loc:(-1)}"
    FNR>8{gsub(" ",OFS);print loc,ser,FILENAME,my_loc,$0}' \
   *.csv > formatted_log.CSV
printf "\nDone1\n"
将不需要的额外行添加到格式化的_log.csv文件中。看起来像这样:

awk -vFS=, -vOFS=, \
   '{gsub("\"","")}
    FNR==4{ser=$2}
    FNR==5{loc=$2}
    FNR>8{gsub(" ",OFS);print loc,ser,FILENAME,${loc:(-1)},$0}' \
   *.csv > formatted_log.csv
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,5:59,20.1
5/28/2015 7:59,27.6
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,7:59,27.6
5/28/2015 9:59,30.1
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,9:59,30.1
5/28/2015 11:59,29.6
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,11:59,29.6
5/28/2015 13:59,29.6
LS_trap_9c,3.6E+15,trap9c_3600000039654841_150809.csv,5/28/2015,13:59,29.6
5/28/2015 15:59,28.1

如何从awk中提取特定字符串的最后一个字符?

要提取awk中的最后一个字符,可以使用:

substr(var,length(var),1)
脚本将是:

awk -vFS=, -vOFS=, \
   '{gsub("\"","")}
   FNR==4{ser=$2}
   FNR==5{loc=$2}
   FNR>8{gsub(" ",OFS);print loc,ser,FILENAME,substr(loc,length(loc),1),$0}' \
   *.csv > formatted_log.csv
来自man awk:

substr(s,i[,n])
返回从i开始最多n个字符的s子字符串。如果省略n,则使用s的其余部分


要提取AWk中的最后一个字符,可以使用:

substr(var,length(var),1)
脚本将是:

awk -vFS=, -vOFS=, \
   '{gsub("\"","")}
   FNR==4{ser=$2}
   FNR==5{loc=$2}
   FNR>8{gsub(" ",OFS);print loc,ser,FILENAME,substr(loc,length(loc),1),$0}' \
   *.csv > formatted_log.csv
来自man awk:

substr(s,i[,n])
返回从i开始最多n个字符的s子字符串。如果省略n,则使用s的其余部分


'/^Location:/{code=substr($0,长度($0))}…“
'/^Location:/{code=substr($0,长度($0))}…”
1
对于最后一个字符不是必需的。@karafka True。直言不讳没有坏处。Me认为?@sorontar你能解释一下substr函数在awk中是如何工作的吗?
1
对于最后一个字符不是必需的。@karafka True。直言不讳没有坏处。我想?@sorontar你能解释一下substr函数在awk中是如何工作的吗?