bash:如何修改字段中的字符串

时间:2014-10-28 05:20:47

标签: bash awk cut

我有以下几行:

field1    1-23_4_5    field3
field1    2-40_5_7    field3
field1    3-43_7_9    field3
             .
             .
             .  

我想修改第二个字段,以便

1-23_4_5变为1-23

我认为awkcut的组合可以解决问题。有一个简单的方法可以解决这个问题吗?

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

通过awk,

$ awk 'sub(/_[^_]*_[^_]*$/,"",$2)1' file
field1 1-23 field3
field1 2-40 field3
field1 3-43 field3

通过sed,

$ sed 's/^\([^ ]\+\ *[^_]\+\)[^ ]\+/\1/g' file
field1    1-23    field3
field1    2-40    field3
field1    3-43    field3

答案 1 :(得分:0)

这是一个awk版本:

awk '{split($2,a,"_");$2=a[1]}1' file
field1 1-23 field3
field1 2-40 field3
field1 3-43 field3

将字段2除以_,并仅使用第一部分 PS它改变了格式。 (与awk一样正常)

答案 2 :(得分:0)

您可以使用readsubstring extraction使用简单的bash脚本轻松完成此操作:

#!/bin/bash

## validate input file
[ -r "$1" ] || { printf "Error: insufficient input. Usage %s <filename>\n"; exit 1; }

## read and extract substring of field2
while read -r f1 f2 f3 || [ -n "$f3" ]; do 
    printf "%s    %s    %s\n" "$f1" "${f2%%_*}" "$f3"; 
done < "$1"

测试文件:

$ cat dat/field.txt
field1    1-23_4_5    field3
field1    2-40_5_7    field3
field1    3-43_7_9    field3

<强>输出:

$ bash fields.sh dat/field.txt
field1    1-23    field3
field1    2-40    field3
field1    3-43    field3