如何使用awk / sed替换某些行中特定列中的数据

时间:2015-04-10 20:21:45

标签: bash awk sed

我有一个以空格分隔的文本文件,其中大部分行如下所示:

--- 23:123456_A_B 123456 A B [and ~600K more columns after that]

但是,有些行的前5列如下所示:

23 . 234567 C D

任何人都可以建议使用awk或sed命令(或任何替代方法)将第一列从23更改为---,将第二列从.更改为{{1} (使用前五列中的数据),同时保持其他列不变,但仅限于那些以23:234567_C_D开头的行?

2 个答案:

答案 0 :(得分:1)

假设字段分隔符只是一个空格,

sed -r 's/^23 \. ([^ ]+) ([^ ]+) ([^ ]+)/--- 23:\1_\2_\3 \1 \2 \3/' file

使用awk更具可读性

awk '$1 == 23 && $2 == "." {$1 = "---"; $2 = "23:" $3 "_" $4 "_" $5} 1' file

使用sed,您可以使用-i选项保存更改 使用awk,您可能必须显式写入临时文件:

tmp=$(mktemp)
awk '....' file > "$tmp" && mv "$tmp" file

答案 1 :(得分:1)

这是你想要的吗?

$ cat file
--- 23:123456_A_B 123456 A B [and ~600K more columns after that]
23 . 234567 C D

$ awk '$1==23 { $2=$1":"$3"_"$4"_"$5; $1="---" }1' file
--- 23:123456_A_B 123456 A B [and ~600K more columns after that]
--- 23:234567_C_D 234567 C D