我想找出哪个列在文件中有特殊字符
例如,我有以下数据:
11|abc|ac♠|12
12|aac|be•|2♣
13|cj♦|jkd|32
期望的输出:
1|3
2|3|4
3|2
我想要记录号以及具有特殊字符的列号。
答案 0 :(得分:0)
您没有定义特殊字符。我会假设你的意思是在正常的ASCII范围之外。尝试:
$ awk -F'|' '{r=""; for (i=1;i<=NF;i++)if($i ~ /[^\t -~]/) r=r OFS i; if (r) print NR r} ' OFS='|' File
1|3
2|3|4
3|2
-F'|'
这告诉awk使用|
作为输入的字段分隔符。
r=""
这会将r
初始化为空字符串。
for (i=1;i<=NF;i++)if($i ~ /[^\t -~]/) r=r OFS i
这会遍历一行中的每个字段,如果它包含正常ASCII范围之外的字符,则会将字段编号添加到r
。
在awk正则表达式中,\t
是制表符,-~
匹配从空白(ASCII 32)到~
(ASCII 126)的任何字符。这些是我们定义为&#34; normal&#34;字符。在awk正则表达式中,^
表示&#34;不是&#34;。因此,[^\t -~]
匹配任何不在我们的普通字符列表中的字符。
您可以随意添加或删除正常列表中的字符。
if (r) print NR r}
如果在浏览完所有字段后,r
是非空的,则打印出记录编号和r
的值。
OFS='|'
这告诉awk使用|
作为输出的记录分隔符。
对于那些喜欢分布在多行的命令的人:
awk -F'|' '
{
r=""
for (i=1;i<=NF;i++)
if ($i ~ /[^\t -~]/)
r=r OFS i
if (r)
print NR r
} ' OFS='|' File