删除文件第二列的特殊字符



我有一个文件s.csv

a,b+ -.,c 
aa,bb ().,c._c

我想从第二列(文件以逗号分隔)中删除所有特殊字符

cat s.csv | tr -dc '[:alnum:]nr' | tr '[:upper:]' '[:lower:]'

上面的代码也删除了第三列的特殊字符。

awk -F, '{print $2}' s.csv | tr -dc '[:alnum:]nr' | tr '[:upper:]' '[:lower:]'

这段代码只打印第二列。

我怎么能从第二列删除特殊字符和价格所有

所需输出应为

a,b,c 
aa,bb,c._c 

删除所有(从第二个字段)

  1. 非大写字母的字符[^A-Z
  2. 或小写字母a-z
  3. 或数字0-9]
  4. 来自第二字段$2
  5. 字段带有","分隔-F ','
  6. 保留输出中的分隔符OFS=FS

$ awk -F ',' 'BEGIN{OFS=FS}{gsub(/[^A-Za-z0-9]/,"",$2); print}' s.csv

# test
$ awk -F ',' 'BEGIN{OFS=FS}{gsub(/[^A-Za-z0-9]/,"",$2); print}' <<<'aa,bb ().,c._c'
aa,bb,c._c

正如下面提到的@ lsama Gris

不要忘记将区域设置设置为C[^A-Za-z0-9]出乎意料地用非西欧字母解释。预谋Awk调用LC_ALL=C

您可以使用awk来使用[:alpha:]字符类,这里是第二个字段,并使用gsub()函数删除非alpha字符:

awk 'BEGIN{OFS=FS=","} {gsub(/[^[:alpha:]]+/, "", $2)} 1' file
a,b,c
aa,bb,c._c
  • 如果你需要其他字符集,你可以看到Ed Morton的回答:https://stackoverflow.com/questions/56481541/how-can-you-tell-which-characters-are-in-which-character-classes并查看"哪些字符属于哪些字符类">

使用下面的Perl一行代码:

perl -F',' -lane '$F[1] =~ s{[W_]+}{}g; @F = map { lc } @F; print join ",", @F; ' in_file > out_file

Perl单行程序使用这些命令行标志:
-e:告诉Perl查找内联代码,而不是在文件中查找。
-n:每次循环输入一行,默认赋值给$_
-l:在执行内联代码之前剥离输入行分隔符(*NIX默认为"n"),并在打印时附加它。
-a:根据空格或-F选项中指定的regex将$_拆分为数组@F
-F',':以逗号分隔为@F,而不是以空格分隔。

s{[W_]+}{}:用空替换出现1次或多次的W(非单词字符)或下划线。


正则表达式使用以下修饰符:
/g

:重复匹配模式。参见:
perldoc perlrun:如何执行Perl解释器:命令行开关
perldoc perlre: Perl正则表达式(regexes)
perldoc perlre: Perl正则表达式(regexes):量词;字符类和其他特殊转义;断言;捕获组
perldoc perlrequick: Perl正则表达式快速入门

为了做到这一点,我不得不改变locale-通过使用octals代替字母,regex引擎将它们视为ASCII,而不是过于聪明-我甚至故意将其设置为比利时法语来说明:

echo 'a,b+ -.,c 
aa,bb ().,c._c' | {m,g}awk '
gsub("[^\060-\071\101-\132\141-\172]+","",$(!_+!_))^_' 
OFS=',' FS=','

a,b,c 
aa,bb,c._c

展示不需要LOCALE=C

LANG="fr_BE.UTF8" gawk -e '
BEGIN { for(_=8*4;_<8^4;_++) { printf("%c",_) } } ' | 

LANG="fr_BE.UTF8" gawk -p- -e '
gsub("[^\060-\071\101-\132\141-\172]+","",$-_)^_' OFS=',' FS=','

——————————

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
# profile gawk, cr'e'e Sun May 29 05:58:26 2022
# R`egle(s)
1  (gsub("[^\060-\071\101-\132\141-\172]+", "", $-_)) ^ _ { # 1
1      print
}

相关内容

  • 没有找到相关文章

最新更新