Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 是否仅对分隔文件的一列执行字符替换/删除?_Bash_Unix_Awk - Fatal编程技术网

Bash 是否仅对分隔文件的一列执行字符替换/删除?

Bash 是否仅对分隔文件的一列执行字符替换/删除?,bash,unix,awk,Bash,Unix,Awk,我有一个csv文件,它有两列,一个数字ID(IDVAR)和一个关联值(VAL)。第二个变量包含需要清理的非字母垃圾字符。结构如下所示: IDVAR VAL 001 abc - 1 002 zfas $^6 003 asdf_78 004 hg :65 我只想从第二个变量中抛出“-”、“”、“$”、“^”等,即从VAL中删除指定的字符集,而不触碰IDVAR 解决方案后编辑:非常感谢SiegeX提供了如此优雅的解决方案。请注意,我的文件确实是逗号分隔的,因此我只

我有一个csv文件,它有两列,一个数字ID(
IDVAR
)和一个关联值(
VAL
)。第二个变量包含需要清理的非字母垃圾字符。结构如下所示:

IDVAR   VAL
001     abc - 1
002     zfas $^6
003     asdf_78
004     hg :65
我只想从第二个变量中抛出
“-”、“”、“$”、“^”
等,即从
VAL
中删除指定的字符集,而不触碰
IDVAR


解决方案后编辑:非常感谢SiegeX提供了如此优雅的解决方案。请注意,我的文件确实是逗号分隔的,因此我只需在其awk命令中添加“-F”选项。

这将适用于您:

awk 'NR>1{t=$1;gsub(/[^[:alpha:]]/,"");$0=t "\t" $0}1' file
实例 解释
  • NR>1
    :跳过包含
    IDVAR VAL
  • t=$1
    :将第一个字段(IDVAR)保存到临时变量“t”中
  • gsub(/[^[:alpha:][]/,“”)
    :表示用空字符串替换所有非字母数字字符的正则表达式。注意
    gsub()
    适用于整行,这就是我们在上面使用“t”的原因
  • $0=t“\t”$0
    :将变量“t”前置到由制表符分隔的行的开头
  • 1
    :打印$0的Awk快捷方式,因为“1”始终为true,并且未明确指定时,true语句的默认行为是打印当前行

  • 这将对您有用:

    awk 'NR>1{t=$1;gsub(/[^[:alpha:]]/,"");$0=t "\t" $0}1' file
    
    实例 解释
  • NR>1
    :跳过包含
    IDVAR VAL
  • t=$1
    :将第一个字段(IDVAR)保存到临时变量“t”中
  • gsub(/[^[:alpha:][]/,“”)
    :表示用空字符串替换所有非字母数字字符的正则表达式。注意
    gsub()
    适用于整行,这就是我们在上面使用“t”的原因
  • $0=t“\t”$0
    :将变量“t”前置到由制表符分隔的行的开头
  • 1
    :打印$0的Awk快捷方式,因为“1”始终为true,并且未明确指定时,true语句的默认行为是打印当前行

  • 我会使用Perl,但这是因为我使用Perl处理像这样的文本

    perl -n -e 'chomp; my($f1,$f2) = $_ =~ m/(\S+)\s+(\S.*)/;
                $f2 =~ s/[-_\$^1]//g; print "$f1\t$f2\n";' file
    
    除此之外,这可能是一行。您必须对
    $
    ^
    -
    稍微小心一点,但是可以很容易地添加其他字符

    给出示例输入和上面要消除的字符列表,输出为:

    IDVAR   VAL
    001     abc  
    002     zfas 6
    003     asdf78
    004     hg :65
    

    也许“例如”应该包括空格、冒号和其他数字?

    我会使用Perl,但这是因为我使用Perl处理像这样的文本

    perl -n -e 'chomp; my($f1,$f2) = $_ =~ m/(\S+)\s+(\S.*)/;
                $f2 =~ s/[-_\$^1]//g; print "$f1\t$f2\n";' file
    
    除此之外,这可能是一行。您必须对
    $
    ^
    -
    稍微小心一点,但是可以很容易地添加其他字符

    给出示例输入和上面要消除的字符列表,输出为:

    IDVAR   VAL
    001     abc  
    002     zfas 6
    003     asdf78
    004     hg :65
    


    也许“例如”应该包括空格、冒号和其他数字?

    这看起来不像逗号分隔的值,CSV代表的是逗号分隔的值。看起来可能是制表符或空格分隔列。对于Jon来说,字段分隔符到底是什么?是的,我的错。原始文件确实是csv,但当我复制粘贴到这里时,双引号和逗号没有显示出来。不知道为什么。这看起来不像逗号分隔的值,CSV就是这个意思。看起来可能是制表符或空格分隔列。对于Jon来说,字段分隔符到底是什么?是的,我的错。原始文件确实是csv,但当我复制粘贴到这里时,双引号和逗号没有显示出来。不知道为什么。谢谢你,西格克斯。这几乎奏效了。不知何故,它正在创建第三个变量,该变量通过制表符与VAL分开。给了我什么?啊。。。知道了。我只需要在awk中添加一个“-F”选项。解决了的。非常感谢大家。@SiegeX,你们能解释一下吗。刚接触awk并试图理解您的解决方案。我认为您根本不必使用临时变量。至少现在您可以使用
    gsub(/[^[:alpha:]/,“”,$NUMBER\u OF_COLUMN\u TO_PROCESS)
    @Dominik问题是
    $NUMBER\u OF_COLUMN\u TO_PROCESS
    不是每个记录的静态数字;这取决于我们正在处理的记录的内容,因为不需要空格。谢谢,SiegeX。这几乎奏效了。不知何故,它正在创建第三个变量,该变量通过制表符与VAL分开。给了我什么?啊。。。知道了。我只需要在awk中添加一个“-F”选项。解决了的。非常感谢大家。@SiegeX,你们能解释一下吗。刚接触awk并试图理解您的解决方案。我认为您根本不必使用临时变量。至少现在您可以使用
    gsub(/[^[:alpha:]/,“”,$NUMBER\u OF_COLUMN\u TO_PROCESS)
    @Dominik问题是
    $NUMBER\u OF_COLUMN\u TO_PROCESS
    不是每个记录的静态数字;这取决于我们正在处理的记录的内容,因为存在不需要的空格。我喜欢这种方法,非常“分而治之”和“使用最简单的工具完成工作”,尽管它不像Awk那样是一个整洁的单行线。我发现
    Awk
    perl
    和类似的一行程序很容易增加复杂性,并在长期内变得难以管理。UNIX允许管道,所以我们应该在有意义的地方使用它,我喜欢降低复杂性和提高可读性。这将替换标题行中的字符。当分隔符出现在转义字符串中时,它也会失败。我喜欢这种方法,非常“分而治之”和“使用最简单的工具完成工作”,尽管它不像Awk那样是一个整洁的单行程序。我发现
    Awk
    perl
    和类似的单行程序很容易增加复杂性,并在长期内变得难以管理。UNIX允许管道,所以我们应该在有意义的地方使用它,我喜欢降低复杂性和提高可读性。这将替换标题中的字符