仅在分隔文件的一列上执行字符替换/删除?

时间:2012-02-14 05:42:47

标签: bash unix awk

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

IDVAR   VAL
001     abc - 1
002     zfas $^6
003     asdf_78
004     hg :65

我只想从第二个变量中删除"-", "_", "1", "$", "^"等,即从VAL删除一组指定的字符,而不触及IDVAR

解决方案后编辑:非常感谢SiegeX提供了这样一个优雅的解决方案。请注意我的文件确实以逗号分隔,所以我只需要在他的awk命令中添加一个“-F”选项。

3 个答案:

答案 0 :(得分:4)

这对你有用:

awk 'NR>1{t=$1;gsub(/[^[:alpha:]]/,"");$0=t "\t" $0}1' file

实施例

$ awk 'NR>1{t=$1;gsub(/[^[:alpha:]]/,"");$0=t "\t" $0}1' file
IDVAR   VAL
001     abc
002     zfas
003     asdf
004     hg

解释

  1. NR>1:跳过包含IDVAR VAL
  2. 的标题行
  3. t=$1:将第一个字段(IDVAR)保存到临时变量“t”
  4. gsub(/[^[:alpha:]]/,""):正则表达式用空字符串替换所有 - 字母数字字符。注意gsub()适用于整行,这就是我们在
  5. 上面使用't'的原因
  6. $0=t "\t" $0:将变量't'添加到由标签分隔的行的开头
  7. 1打印$ 0 的awk快捷方式,因为“1”始终为true,未明确指定时,true语句的默认行为是打印当前行。

答案 1 :(得分:1)

cut -f1 -d, foo > foo.firstColumn
cut -f2 -d, foo \
    | sed 's/[-_1$^]//g' \
    | paste foo.firstColumn - \
    > foo.stripped
rm foo.firstColumn

答案 2 :(得分:0)

我使用Perl,但那是因为我将Perl用于文本修改的许多目的。

perl -n -e 'chomp; my($f1,$f2) = $_ =~ m/(\S+)\s+(\S.*)/;
            $f2 =~ s/[-_\$^1]//g; print "$f1\t$f2\n";' file

除了SO,这可能是一行。您必须对$^-小心谨慎,但可以非常轻松地添加其他字符。

将您的样本输入和上面的字符列表删除,输出为:

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

也许'比如'应该包含空格,冒号和其他数字?