2017-03-26 1 views
0

私はこのような何かを見て、多くのデータファイルがあります。私はこのスクリプトでこれらのファイルを解析 ,8/9/2015 Timezone,-6 , Serial No.,19000000395CCE41 Location:,LS_trap_9u High temperature limit (�C),20.12 Low temperature limit (�C),0.05 Date - Time,Temperature (�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内から特定の文字列の最終文字を抽出し、それを列に追加する方法は?

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 

私は次のエラーを取得:変更

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" 

はformattted_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の最後の文字を抽出するために

+0

場所:/ {code = substr($ 0、length($ 0))} ... ' – karakfa

答えて

1

、あなたが使用できます。

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 

男のawkから:

SUBSTR(S、I [、n])
iから始まるsの最大n文字の部分文字列を返します。 nが省略された場合は、残りのsを使用します。

+0

'1'は最後の文字には必要ありません。 – karakfa

+0

@karafka本当です。明白であることは害を及ぼさない。私は思いますか? – sorontar

+0

@sorontarあなたはawk内でsubstr関数がどのように機能するかについて少し説明できますか? – 5r9n

関連する問題