awkから特定の種類の文字を削除する方法

awkから特定の種類の文字を削除する方法

A.csv (sep=",") ファイルがあります。

Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*
07/15/20  19:10:03,TAQPATH-AB275013338-MOL_0003,2060565907,E11,Patient,VALID,SARS-CoV-2 Not Detected,REPORT
07/15/20  19:10:03,TAQPATH-AB275013338-MOL_0003,2060565919,A10,Patient,VALID,SARS-CoV-2 Not Detected,REPORT
07/15/20  19:10:03,TAQPATH-AB275013338-MOL_0003,2060565931,E01,Patient,VALID,SARS-CoV-2 Not Detected,REPORT

列4から「0」を削除したいのですが、数字[1-9]のみです。つまり、データが「B01」の場合は「B1」が必要ですが、データが「B10」の場合はそのままにしたいのです。 「B10」。私の例では、次のようになります。

Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*
07/15/20  19:10:03,TAQPATH-AB275013338-MOL_0003,2060565907,E11,Patient,VALID,SARS-CoV-2 Not Detected,REPORT
07/15/20  19:10:03,TAQPATH-AB275013338-MOL_0003,2060565919,A10,Patient,VALID,SARS-CoV-2 Not Detected,REPORT
07/15/20  19:10:03,TAQPATH-AB275013338-MOL_0003,2060565931,E1,Patient,VALID,SARS-CoV-2 Not Detected,REPORT

私はそれを完了しました:

awk -F ","  'BEGIN{OFS=",";} {sub("0", "", $4); print}' A.csv > B.csv

ただし、「0」はすべて削除されます。誰にもアイデアはありますか?

ありがとう

ベストアンサー1

1つの方法は、最初の文字をバックアップし、次を0使用して先行文字を含む部分を置き換えることです。sub()

awk -F "," 'BEGIN{ OFS="," } $4 ~ /^[[:alpha:]]/ { lead = substr($4, 1, 1); sub ("^[[:alpha:]]0*", lead, $4) }1' file

初期条件は、文字で始まる行$4 ~ /^[[:alpha:]]/のみを表示します。$4関数を使用してこの行の最初の数字のみを抽出し、substr()最初sub()から置換を使用し、すべての先行ゼロを使用してパターンを最初の文字にのみ置き換えます。

もう1つの方法は、最初のアルファベットの後の部分を強制的に数字の部分に変換して、+0前のゼロを削除することです。

awk -F "," 'BEGIN{ OFS="," } $4 ~ /^[[:alpha:]]/ && NR > 1 { $4 = substr($4, 1, 1) "" substr($4, 2)+0 }1' file

おすすめ記事