如何在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

一种方法是备份第一个字符并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()从头开始替换和所有前导零,并仅用第一个字符替换该模式。

另一种方法是强制将第一个字母表之后的部分转换为数字部分+0,这将去掉前导零

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

相关内容