Bash 是否仅对分隔文件的一列执行字符替换/删除?
我有一个csv文件,它有两列,一个数字ID(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提供了如此优雅的解决方案。请注意,我的文件确实是逗号分隔的,因此我只
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允许管道,所以我们应该在有意义的地方使用它,我喜欢降低复杂性和提高可读性。这将替换标题中的字符