我有一个包含以下 3 列的文件
1 a1 abcd
2 b1 acdb
3 c1 abcd
我需要根据位置过滤器 (2=="b") 上第 3 列的子字符串提取/打印行,因此输出应该是
1 a1 abcd
3 c1 abcd
基于(根据过滤器在 awk 中打印列的子字符串),我尝试过:
awk -F '\t' -v OFS='\t' '{ $3=substr($3,2,1); print $0 }' a.txt
我有一个包含以下 3 列的文件
1 a1 abcd
2 b1 acdb
3 c1 abcd
我需要根据位置过滤器 (2=="b") 上第 3 列的子字符串提取/打印行,因此输出应该是
1 a1 abcd
3 c1 abcd
基于(根据过滤器在 awk 中打印列的子字符串),我尝试过:
awk -F '\t' -v OFS='\t' '{ $3=substr($3,2,1); print $0 }' a.txt
你可以使用这个
awk
:扩展 anubhava 的答案以允许动态指定各种参数:
或者执行拆分后返回更紧凑的输入:
您的代码
确实将第 3 个字段更改为第 3 个字段的第 2 个字符,并打印更改的行。您正在使用没有模式的操作,而您应该使用没有操作的模式(因此将应用打印行的默认操作)。您可以使用已经显示的函数,或者在第 3 个字段使用正则表达式,如下所示,让内容为
substr
file.tsv
然后
给出输出
解释:我告诉 GNU
AWK
字段被 TAB 字符分割(请注意,这对于您的示例行来说并非绝对必要,因为行不包含除 TAB 之外的空白字符),然后我使用模式来查找第三行以 (^
) 任何字符 (.
) 开头的行,后跟b
。此解决方案假设第三个字段中字母的位置是固定的,如果不是这种情况,请不要使用此解决方案。(在 GNU Awk 5.1.0 中测试)