我有一个csv文件,它有两列,一个数字ID(IDVAR
)和一个关联值(VAL
)。第二个变量包含需要清理的非字母垃圾字符。结构如下所示:
IDVAR VAL
001 abc - 1
002 zfas $^6
003 asdf_78
004 hg :65
我只想从第二个变量中删除"-", "_", "1", "$", "^"
等,即从VAL
删除一组指定的字符,而不触及IDVAR
。
解决方案后编辑:非常感谢SiegeX提供了这样一个优雅的解决方案。请注意我的文件确实以逗号分隔,所以我只需要在他的awk命令中添加一个“-F”选项。
答案 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
NR>1
:跳过包含IDVAR VAL
t=$1
:将第一个字段(IDVAR)保存到临时变量“t”gsub(/[^[:alpha:]]/,"")
:正则表达式用空字符串替换所有非 - 字母数字字符。注意gsub()
适用于整行,这就是我们在$0=t "\t" $0
:将变量't'添加到由标签分隔的行的开头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
也许'比如'应该包含空格,冒号和其他数字?