Shell脚本以删除“之间的单词”&引用;及&引用;在文件的第一行中

Shell脚本以删除“之间的单词”&引用;及&引用;在文件的第一行中,shell,csv,Shell,Csv,我有一个CSV文件,其中包含以下格式的第一行 aaa.bbb.ccc.ddd,eee.fff.ggg.hhh,iii.jjj.kkk.lll,mmm.nnn.ooo.ppp 需要读取CSV文件的第1行 然后,阅读第三个和,之间的单词,即输出应如下所示。 ddd、hhh、lll、ppp 将上述输出作为CSV文件中的第一行进行中继 我想在shell脚本上完成这项工作 多谢各位 Kiran Kumar G您可以使用此awk命令: awk -F '[.,]' 'NR==1{s=$4; for(i=

我有一个CSV文件,其中包含以下格式的第一行

aaa.bbb.ccc.ddd,eee.fff.ggg.hhh,iii.jjj.kkk.lll,mmm.nnn.ooo.ppp
  • 需要读取CSV文件的第1行
  • 然后,阅读第三个
    之间的单词,即输出应如下所示。
    ddd、hhh、lll、ppp
  • 将上述输出作为CSV文件中的第一行进行中继
我想在shell脚本上完成这项工作

多谢各位


Kiran Kumar G

您可以使用此awk命令:

awk -F '[.,]' 'NR==1{s=$4; for(i=8; i<=NF; i+=4) s=s "," $i; print s}' file
ddd,hhh,lll,ppp

awk-F'[,]''NR==1{s=$4;对于(i=8;i您可以使用此awk命令:

awk -F '[.,]' 'NR==1{s=$4; for(i=8; i<=NF; i+=4) s=s "," $i; print s}' file
ddd,hhh,lll,ppp
awk-F'[,]'NR==1{s=$4;对于(i=8;i
#维护当前的IFS
OIFS=$IFS
#将每个CSV值读入数组
如果s=','read-a数组
#维护当前的国际单项体育联合会
OIFS=$IFS
#将每个CSV值读入数组
如果s=','read-a数组<代码> > p>您可以考虑使用Perl:
更改脚本中的文件名并使用以下命令运行:

$ ./<script name>.pl > newfile.csv

#!/usrbin/perl -w

$thefile = "yourfile.csv";
open(CSV_FILE, $thefile) or
   die "\nError: cannot open file $thefile\n\n";

while ($line = <CSV_FILE>)
{
   if ($. == 1)
   {
       chomp($line);
       @comma_chunks = split(/,/,$line);
       foreach my $commachunk (@comma_chunks)
       {
           @dot_chunks = split(/\./,$commachunk);
           push(@last_dot_chunks, $dot_chunks[-1]); # last of the dotchunks 
       }
       $new_first_line = join(',', @last_dot_chunks);
       print "$new_first_line\n";
   }
   else
   {
       print $line;
   }
}
$./.pl>newfile.csv
#!/usrbin/perl-w
$thefile=“yourfile.csv”;
打开(CSV_文件,$thefile)或
死“\n错误:无法打开文件$thefile\n\n”;
而($line=)
{
如果($。==1)
{
chomp($line);
@逗号块=分割(/,/,$行);
foreach my$commachunk(@comma_chunks)
{
@点块=分割(/\./,$commachunk);
推送(@last_dot_chunks,$dot_chunks[-1]);#最后一个点块
}
$new_first_line=join(“,”,@last_dot_chunks);
打印“$new\u第一行\n”;
}
其他的
{
打印$行;
}
}

<代码> > p>您可以考虑使用Perl:
更改脚本中的文件名并使用以下命令运行:

$ ./<script name>.pl > newfile.csv

#!/usrbin/perl -w

$thefile = "yourfile.csv";
open(CSV_FILE, $thefile) or
   die "\nError: cannot open file $thefile\n\n";

while ($line = <CSV_FILE>)
{
   if ($. == 1)
   {
       chomp($line);
       @comma_chunks = split(/,/,$line);
       foreach my $commachunk (@comma_chunks)
       {
           @dot_chunks = split(/\./,$commachunk);
           push(@last_dot_chunks, $dot_chunks[-1]); # last of the dotchunks 
       }
       $new_first_line = join(',', @last_dot_chunks);
       print "$new_first_line\n";
   }
   else
   {
       print $line;
   }
}
$./.pl>newfile.csv
#!/usrbin/perl-w
$thefile=“yourfile.csv”;
打开(CSV_文件,$thefile)或
死“\n错误:无法打开文件$thefile\n\n”;
而($line=)
{
如果($。==1)
{
chomp($line);
@逗号块=分割(/,/,$行);
foreach my$commachunk(@comma_chunks)
{
@点块=分割(/\./,$commachunk);
推送(@last_dot_chunks,$dot_chunks[-1]);#最后一个点块
}
$new_first_line=join(“,”,@last_dot_chunks);
打印“$new\u第一行\n”;
}
其他的
{
打印$行;
}
}
使用文件名作为第一个参数调用该脚本。如果坚持使用shell脚本执行此操作,可能最简单的方法是:

#!/bin/sh

perl -e '
use Tie::File;
tie my @a, "Tie::File", $ARGV[0] or die "$ARGV[0]:$!";
$a[0] =  join ",",  map { (split /\./)[3] } split ",", $a[0];
' input-file
虽然您可能应该用
$1
替换
输入文件
,并将文件名作为第一个参数传递。
Tie::file
是一个很好的小模块,它将绑定的文件映射到数组,因此您可以简单地操作数组的元素并在文件中进行更改。在这种情况下,我们只是绑定您的inp将ut文件复制到数组
@a
,然后按照描述拆分第一个字段

使用文件名作为第一个参数调用该脚本。如果坚持使用shell脚本执行此操作,可能最简单的方法是:

#!/bin/sh

perl -e '
use Tie::File;
tie my @a, "Tie::File", $ARGV[0] or die "$ARGV[0]:$!";
$a[0] =  join ",",  map { (split /\./)[3] } split ",", $a[0];
' input-file

虽然您可能应该用
$1
替换
输入文件
,并将文件名作为第一个参数传递。
Tie::file
是一个很好的小模块,它将绑定的文件映射到数组,因此您可以简单地操作数组的元素并在文件中进行更改。在这种情况下,我们只是绑定您的input文件到数组
@a
,然后按照您的描述拆分第一个字段。

感谢Anubhava提供的解决方案,它对我来说很好,因为我需要在shell脚本中使用它。如果源字符串不是规则模式,那么还需要一个信息,比如-aa.bb,cc.dd,ee.ff,gg.hh.ii.jj,kk.ll.mm.nn,那么如何在“,”?输出应该是--bb,dd,ff,jj,nn。请求您的帮助。谢谢您。感谢Anubhava提供的解决方案,它对我来说很好,因为我需要在shell脚本中使用它。如果源字符串不是规则模式,那么需要一个额外的信息,比如--aa.bb,cc.dd,ee.ff,gg.hh.ii.jj,kk.ll.mm.nn--那么如何在“,”之前获取单词的名称。”?输出应该是--bb,dd,ff,jj,nn。请求您的帮助。谢谢。