删除列中的特定字符

时间:2017-10-18 03:11:35

标签: shell

我有一个文件:

SELECT EmpID, 
       ValidDate, 
       GROUP_CONCAT(ValidTime ORDER BY ValidTime ASC) AS logTime 
FROM logs 
WHERE Processed = 0 
GROUP BY EmpID, ValidDate ORDER BY ValidDate ASC

我想要做的是删除第2列中__之后的字符,以获得所需的输出:

col1    col2    col3
118566815   comp120568_c0_seq1_xn1_una_478__176 176
118588302   100034943_0__140    140
118575711   100079758_0__55 55
118545625   10009810_0__57  57

有关如何执行此操作的任何建议吗?

3 个答案:

答案 0 :(得分:2)

awk '{split($2,a,/__/);$2=a[1]}1' input

输出:

col1 col2 col3
118566815 comp120568_c0_seq1_xn1_una_478 176
118588302 100034943_0 140
118575711 100079758_0 55
118545625 10009810_0 57

在提出问题之前搜索网站:)您可以找到类似的问题here

答案 1 :(得分:1)

如上所述,使用双下划线分隔您要移除的最后一组数字,您也可以使用sed完成此操作:

$ sed 's/__[^ \t]*//' file
col1    col2    col3
118566815   comp120568_c0_seq1_xn1_una_478 176
118588302   100034943_0    140
118575711   100079758_0 55
118545625   10009810_0  57

<强>解释

  1. sed 's/find/replace/'是一般sed替换。

  2. __[^ \t]*查找 - 后面的两个下划线和所有字符 spacetab

  3. replace什么也没有。

  4. 注意:这仅适用于分隔最后一组数字的双下划线

答案 2 :(得分:0)

说明:

第一个子删除双下划线和以下字符 在零前面,零完好无损。为了使它工作,我必须 表明涉及哪个领域。

第二个子点从下划线开始,但在这里我们留下一个空格。

    awk '{sub(/0__.*/,"0",$2)sub(/__176/," ")}1' file

    col1    col2    col3
    118566815   comp120568_c0_seq1_xn1_una_478  176
    118588302 100034943_0 140
    118575711 100079758_0 55
    118545625 10009810_0 57