awkとシステムを使用して印刷してcsvファイルに追加する

awkとシステムを使用して印刷してcsvファイルに追加する

13個の列を含むCSVファイルに列を追加しようとしています。
次のコマンドを実行しています。

awk -F "," 'BEGIN{ OFS="," } {gsub(/"/, "", $1);$14=system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"");print}' mycsv.csv > test  

その結果、13フィールドの末尾に次のものが追加されます^M,1(または^M,0新しい列の値($ 14でなければなりません)が2行目に追加されますので、
csvが壊れます。
ここで問題は何ですか?

入力例:

"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  

予想出力:

"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now", 1485771295  

修正する:
これ:

awk -F"," 'BEGIN{ OFS="," } {gsub(/"/, "", $1);system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"")|getline $14; print}' mycsv.csv > test  

終了ステータスには0または1はありませんが、新しい行属性がsystemあるため^M、$ 14が新しい行に印刷されます。

アップデート2:

$ cat mycsv.csv 
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"    

行為:

$ awk -F"," '{printf; printf ","; gsub(/"/, "", $1);system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"")}' mycsv.csv > test  
Failed conversion of ``1/30/2017 11:14:55 AM'' using format ``%m/%d/%Y %H:%M:%S %p''  
date: illegal time format  
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...   
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]    

結果ファイル:
catを実行すると、次のようになります。

$ cat test
,1485771295 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
,148577129511:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"    

vimで開くと、^Mafterが表示されます。"Now"

アップデート3:
奇妙なことは、行全体を印刷できないことです。以下はごみを提供します:

$awk -F',' '{ printf $0 }' mycsv.csv   
","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now""  

しかし、これはうまくいきます(しかし、追加された新しい行を印刷したくありません):

$ awk -F',' '{ print $0; }' mycsv.csv   
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","[email protected]","A","6.0.12","A","Now"  

ベストアンサー1

awk(1)私たちが読んだことから

   system(cmd)
          executes cmd and returns its exit status

したがって、0はシステムコマンドの結果(正常終了)によって返された終了状態です。この場合、単純な例のように、標準出力が正しい場所に配置されるように、既存の列、カンマを印刷してから日付を印刷する必要があります。

(echo a,b,c; echo e,f,g) \
| awk -F, '{printf "%s", $0;printf ",";system("echo more")}'

最初の列の入力として新しい列を追加することはあまり変わりません。データを印刷し、コンマを追加し、$1その後のシステムを変更し、システムコールを実行します。

$ cat input 
"1/30/2017 11:14:55 AM","I","M"
$ awk -F, '{printf "%s", $0;printf ",";gsub(/"/, "", $1);system("date -jf \"%m/%d/%Y %H:%M:%S %p\" \""$1"\" \"+%s\"")}' input
"1/30/2017 11:14:55 AM","I","M",1485774895

おすすめ記事