如何仅在 awk 或 bash 的列/字段中删除特定字符后的字符串?

Giu*_*rio 6 awk sed

我有一个带有制表符分隔字段(或列)的文件,如下所示:

cat abc_table.txt
a   b   c
1   11;qqw  213
2   22  222
3   333;rs2 83838
Run Code Online (Sandbox Code Playgroud)

我想删除“;”之后的所有内容 仅在第二个字段上。

我试过

awk 'BEGIN{FS=OFS="\t"} NR>=1 && sub (/;[*]/,"",$2){print $0}' abc_table.txt
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用。我也尝试过 sed:

 's/;.*//g' abc_table.txt
Run Code Online (Sandbox Code Playgroud)

但它也会删除第三个字段中的字符串:

a   b   c
1   11
2   22  222
3   333
Run Code Online (Sandbox Code Playgroud)

所需的输出是:

a   b   c
1   11  213
2   22  222
3   333 83838
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我,我将不胜感激!

Rav*_*h13 6

您需要简单地更正正则表达式。

awk '{sub(/;.*/,"",$2)} 1' Input_file
Run Code Online (Sandbox Code Playgroud)

如果您有 Input_file TAB 分隔,请尝试:

awk 'BEGIN{FS=OFS="\t"} {sub(/;.*/,"",$2)} 1' Input_file
Run Code Online (Sandbox Code Playgroud)

OP 正则表达式中的问题: OP 的正则表达式在第二个字段中;[*]寻找;*(文字字符),这就是为什么它不能;在第二个字段中替换所有内容。我们需要简单地给出;.*这意味着从;第二个字段的第一次出现到最后一个获取所有内容,然后在第二个字段中用 NULL 替换。