Linux 就地修改csv文件中除标题以外的所有列

Linux 就地修改csv文件中除标题以外的所有列,linux,awk,Linux,Awk,我有一个如下的csv文件: Id EMAIL Service Number 1 Test@email.com http 345 2 This.isATest@tmail.com dns 4 3 ConTact.Help@gmail.com ftp 4568 Id EMAIL Service Number 1 test@email.com http 345 2 this.isatest@tmail.com dns 4 3 co

我有一个如下的csv文件:

   Id EMAIL Service Number
    1 Test@email.com http 345 
    2 This.isATest@tmail.com dns 4 
    3 ConTact.Help@gmail.com ftp 4568 
   Id EMAIL Service Number
    1 test@email.com http 345 
    2 this.isatest@tmail.com dns 4 
    3 contact.help@Gmail.com ftp 4568 
我希望输出如下:

   Id EMAIL Service Number
    1 Test@email.com http 345 
    2 This.isATest@tmail.com dns 4 
    3 ConTact.Help@gmail.com ftp 4568 
   Id EMAIL Service Number
    1 test@email.com http 345 
    2 this.isatest@tmail.com dns 4 
    3 contact.help@Gmail.com ftp 4568 
我想把第二个字段改成小写,只把第二个字段改成小写

目前,我设法用awk实现了这一点,但它也修改了第一行的第二个字段,将其降低为电子邮件。我希望电子邮件在本例中保持大写,但降低所有列

awk '$2 = tolower($2)' test.csv >  tmp & mv tmp test.csv 
输出:

   Id email Service Number
    1 test@email.com http 345 
    2 this.isatest@tmail.com dns 4 
    3 contact.help@Gmail.com ftp 4568 
问题2:

在那之后有没有办法触发磁场

电子邮件 而不是做2美元

编辑以清除内容:

如果字段EMAIL和此列中的所有值不在第二个字段中,而是在n字段中,是否有方法通过搜索电子邮件和列的小写直接触发此字段

可以使用awk NR仅选择记录2及以上

旁注:该文件不是CSV,在表面上,从样本数据和awk脚本来看,它是空格分隔的或制表符分隔的

这个脚本写得很冗长。如果需要,可以做得更紧凑

# Single line
awk 'NR > 1 { $2 = tolower($2) } { print }' < input-file-name > tmp && mv tmp input-file-name

# Multi-line
awk '
# Replace $2 on line 2+ with the lowercae
NR > 1 { $2 = tolower($2) }
# Print all lines
{ print }
' < input-file-name


感谢分享您的尝试,但您的问题特别是第二部分不清楚,请在您的问题中添加更多详细信息,了解您试图实现的目标,然后让我们知道。@RavinderSingh13感谢您的回复,我做了编辑,希望事情现在变得更清楚,你为什么调用toupper而不是tolower来将字符串变为小写?@quasimodo我的错,我刚刚编辑了这个问题。在我的示例中,使用NR不起作用,并返回一个csv文件空0 oct不知道为什么,但通过执行NR>1{$2=tolower$2文件变为空0八位字节文件确实是csv,但我无法在问题中上载csv?@StillLearningHowtoDoi查看并回答您的问题,以包含csv文件的真实内容。@dash-o我只是修改了问题,可能我问错了,我的代码正在运行,我可以修改我想要的内容但是,不能忽略headerfirst行我修改了单行响应以包含就地编辑。我仍然对CSV/TSV感到困惑。示例数据没有逗号