通过gitbash

时间:2018-11-13 23:46:05

标签: bash perl git-bash

如果有可用文件,我有几个文件要在其中应用。

我的一位同事开发了一个perl脚本,以从特定坐标开始获取文件中唯一字符/字符串的比例,它的工作方式如下:

$./perlscript.pl --f=<File.gz> --r=<row start> --c=<col start> > outputfile

这很棒,因为它可以处理各种文件和大小。

将此脚本应用于少数文件后,我发现很多这些独特的字符在其后都有一个空格。

同一位同事开发了一个脚本,该脚本可以用其他脚本替换不需要的字符,问题是此脚本一次只能替换一个选项,并且如果该不需要的字符与其他所需的字符一起出现,则无法识别特定的不需要的字符,即:

要从“ AB”和“ CD”中获得“ AB”和“ CD”,我必须指定脚本,分别将“ AB”替换为“ AB”,将“ CD”替换为“ CD”。

我只想消除文件中从特定坐标开始的空间,以免混淆名称和行名。

它不必只与sed一起使用,也可以是perl脚本或awk函数。

1 个答案:

答案 0 :(得分:0)

问题似乎可以归结为:

  

那么您是否只想删除每个制表符分隔字段末尾的所有空格?

     

是的,不影响第一列和第一行,因为它们是元数据字段

假设您不必担心带有嵌入式选项卡的任何字段(如果这样做,则需要具有实际CSV解析器的解决方案):

跳过第一列和第一行会使其变得更加复杂,但是仍然可以通过有点麻烦的单行代码来完成:

$ cat a.tsv
foo     bar     baz
ab  bc  de
1   1   3
$ xxd a.tsv
00000000: 666f 6f20 0962 6172 2009 6261 7a0a 6162  foo .bar .baz.ab
00000010: 2009 6263 2009 6465 0a31 2020 0931 2020   .bc .de.1  .1  
00000020: 0933 0a                                  .3.
$ perl -pe 'if ($. > 1) { my @f = split /\t/; $_ = join "\t", $f[0], map { s/ +$//; $_ } @f[1..$#f] }' a.tsv | xxd
00000000: 666f 6f20 0962 6172 2009 6261 7a0a 6162  foo .bar .baz.ab
00000010: 2009 6263 0964 650a 3120 2009 3109 330a   .bc.de.1  .1.3.

您可以看到除第一行和随后几行的第一列以外的其他字段中的尾随空格。

如果要在适当的位置编辑目录树中的文件,

$ find /path/to/the/dir/ -name "*.tsv" -exec perl -pi -e 'if ($. > 1) { my @f = split /\t/; $_ = join "\t", $f[0], map { s/ +$//; $_ } @f[1..$#f] }' \{\} \;