如何查找哪个列在文件中有特殊字符

时间:2018-04-02 19:01:20

标签: linux shell unix awk

我想找出哪个列在文件中有特殊字符

例如,我有以下数据:

11|abc|ac♠|12
12|aac|be•|2♣
13|cj♦|jkd|32

期望的输出:

1|3
2|3|4
3|2

我想要记录号以及具有特殊字符的列号。

1 个答案:

答案 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