我有一个以空格分隔的文本文件,其中大部分行如下所示:
--- 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
开头的行?
答案 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