如何获取具有特定字段子字符串的 csv 文件的列?

How to get columns of a csv file with substring of specific field?

我有一个包含以下内容的 csv 文件:

G11123,IT,AMIT,INDIA
G11124,IT,HEMANT,INDIA
.......
.......

我有大约 7000 行。

我需要另一个包含以下内容的 csv 文件:

G11,AMIT,INDIA
G11,HEMANT,INDIA
.........
.......

当我尝试以下命令时

awk 'BEGIN{FS=OFS=","} {print substr(,1,3),,}' file.csv > temp.csv

当我检查 temp.csv 时,第一行我没有得到预期的结果,而在所有其他行中,正确的子字符串是可见的:

,AMIT,INDIA
G11,HEMANT,INDIA
...............
...............

上面的命令有问题吗?

此致,

您可以使用逗号作为字段分隔符并使用 OFS 连接值:

awk 'BEGIN{FS=OFS=","} {print substr(,1,3) OFS  OFS }' file.csv > temp.csv

参见online demo

s='G11123,IT,AMIT,INDIA
G11124,IT,HEMANT,INDIA'
awk 'BEGIN{FS=OFS=","} {print substr(,1,3) OFS  OFS }' <<< "$s"

输出:

G11,AMIT,INDIA
G11,HEMANT,INDIA

使用您显示的示例,请尝试遵循 awk 代码。如果您的 Input_file 中有超过 4 个字段,此代码甚至可以工作(因为它不是硬编码应该打印多少个字段)。

awk 'BEGIN{FS=OFS=","} {len=length();sub(".{"len-3"}$","",);="";sub(/,/,"")} 1'  Input_file

解释:为以上添加详细解释。

awk '                        ##Starting awk program from here.
BEGIN{                       ##Starting BEGIN section of this program from here.
  FS=OFS=","                 ##Setting FS and OFS to comma here.
}
{
  len=length()             ##Take length of 1st field here.
  sub(".{"len-3"}$","",)   ##Substituting everything apart from 1st 3 characters in 1st field with NULL.
  =""                      ##Nullifying 2nd field here.
  sub(/,/,"")                ##Substituting comma with NULL here.
}
1                            ##Printing current line here.
'  Input_file                ##Mentioning Input_file name here.

编辑: 要删除控制 M 字符和打印行,可以尝试以下操作。

awk 'BEGIN{FS=OFS=","} {sub(/\r$/,"");len=length();sub(".{"len-3"}$","",);="";sub(/,/,"")} 1'  Input_file