Shell脚本删除"。"之间的单词。和","在文件的第一行

时间:2015-09-02 19:54:07

标签: shell csv

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

aaa.bbb.ccc.ddd,eee.fff.ggg.hhh,iii.jjj.kkk.lll,mmm.nnn.ooo.ppp
  • 需要阅读CSV文件的第1行。
  • 然后,阅读第3 .,之间的字,即输出应如下所示。 ddd,hhh,lll,ppp
  • 将上述输出重新作为CSV文件中的第一行。

我想在shell脚本上完成此操作。

谢谢

Kiran Kumar G

4 个答案:

答案 0 :(得分:0)

您可以使用此awk命令:

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

-F '[.,]'会将输入字段分隔符设为,.

NR==1将仅运行第一条记录。

答案 1 :(得分:0)

//= require jquery_ujs
//= require jquery
//= require turbolinks
//= require bootstrap
//= require_tree .

答案 2 :(得分:0)

您可以考虑使用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;
   }
}

答案 3 :(得分:0)

#!/usr/bin/env perl

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

使用您的文件名作为第一个参数调用该脚本。如果您坚持使用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

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