如果使用 awk 在一行中出现一个单词,如何对一行进行多次更改?
How to make multiple changes to a line if occurence of a word in a line using awk?
我有一个看起来像这样的文件,没有 header,有 2059 行和 6 列:
RQ...ID 仅存在于文件的某些行(粗体)的第 2 列中。例如,在下面的示例中,它存在于以 141、147 和 148 开头的行中。
136 471254 0 0 2 -0.487238289
137 472084 0 0 2 -0.324059074
138 471040 0 0 2 -0.199028334
139 472755 0 0 2 -9
140 471309 0 0 2 -9
141 **RQ00245-7** 0 0 2 -0.532578612
142 471311 0 0 2 2.593358921
143 472898 0 0 2 -0.525585159
144 471327 0 0 2 -9
145 471097 0 0 2 -0.20795088
146 472930 0 0 2 -9
147 **RQ00255-5** 0 0 2 -0.215851064
148 **RQ002657-9** 0 0 2 -0.9847894030
我只想在第 2 列中出现以 RQ 开头的单词时更改每一行。如果 RQ... 存在于第 2 列中的一行中,我想做两件事:
- 我想在同一行的第 1 列中重复这个特定的 RQ ID。
- 我还想在所有情况下将同一行第 6 列中的值更改为“-9”。因此,更改仅在第二列中存在 RQ... 的行中实施。因此该文件应如下所示:
136 471254 0 0 2 -0.487238289
137 472084 0 0 2 -0.324059074
138 471040 0 0 2 -0.199028334
139 472755 0 0 2 -9
140 471309 0 0 2 -9
RQ00245-7 RQ00245-7 0 0 2 -9
142 471311 0 0 2 2.593358921
143 472898 0 0 2 -0.525585159
144 471327 0 0 2 -9
145 471097 0 0 2 -0.20795088
146 472930 0 0 2 -9
RQ00255-5 RQ00255-5 0 0 2 -9
RQ002657-9 RQ002657-9 0 0 2 -9
我是 awk 的新手,但我假设它会以这样的方式开始(使用 if 语句说明如果列 2
以 RQ
开头,则将列 6
更改为 -9
并更改列 1
与列 2
:
相同
awk '{ if '~/^RQ/' ) ="-9", = ;}'
你可以试试这个awk
:
awk ' ~ /^RQ/ { = ; $NF = -9} 1' file | column -t
136 471254 0 0 2 -0.487238289
137 472084 0 0 2 -0.324059074
138 471040 0 0 2 -0.199028334
139 472755 0 0 2 -9
140 471309 0 0 2 -9
RQ00245-7 RQ00245-7 0 0 2 -9
142 471311 0 0 2 2.593358921
143 472898 0 0 2 -0.525585159
144 471327 0 0 2 -9
145 471097 0 0 2 -0.20795088
146 472930 0 0 2 -9
RQ00255-5 RQ00255-5 0 0 2 -9
RQ002657-9 RQ002657-9 0 0 2 -9
详情:
~ /^RQ/
检查第二列是否以 RQ
开头
= ; $NF = -9
:将第一个字段值设置为第二个字段并将最后一个字段设置为-9
column -t
已用于表格输出
我有一个看起来像这样的文件,没有 header,有 2059 行和 6 列: RQ...ID 仅存在于文件的某些行(粗体)的第 2 列中。例如,在下面的示例中,它存在于以 141、147 和 148 开头的行中。
136 471254 0 0 2 -0.487238289
137 472084 0 0 2 -0.324059074
138 471040 0 0 2 -0.199028334
139 472755 0 0 2 -9
140 471309 0 0 2 -9
141 **RQ00245-7** 0 0 2 -0.532578612
142 471311 0 0 2 2.593358921
143 472898 0 0 2 -0.525585159
144 471327 0 0 2 -9
145 471097 0 0 2 -0.20795088
146 472930 0 0 2 -9
147 **RQ00255-5** 0 0 2 -0.215851064
148 **RQ002657-9** 0 0 2 -0.9847894030
我只想在第 2 列中出现以 RQ 开头的单词时更改每一行。如果 RQ... 存在于第 2 列中的一行中,我想做两件事:
- 我想在同一行的第 1 列中重复这个特定的 RQ ID。
- 我还想在所有情况下将同一行第 6 列中的值更改为“-9”。因此,更改仅在第二列中存在 RQ... 的行中实施。因此该文件应如下所示:
136 471254 0 0 2 -0.487238289
137 472084 0 0 2 -0.324059074
138 471040 0 0 2 -0.199028334
139 472755 0 0 2 -9
140 471309 0 0 2 -9
RQ00245-7 RQ00245-7 0 0 2 -9
142 471311 0 0 2 2.593358921
143 472898 0 0 2 -0.525585159
144 471327 0 0 2 -9
145 471097 0 0 2 -0.20795088
146 472930 0 0 2 -9
RQ00255-5 RQ00255-5 0 0 2 -9
RQ002657-9 RQ002657-9 0 0 2 -9
我是 awk 的新手,但我假设它会以这样的方式开始(使用 if 语句说明如果列 2
以 RQ
开头,则将列 6
更改为 -9
并更改列 1
与列 2
:
awk '{ if '~/^RQ/' ) ="-9", = ;}'
你可以试试这个awk
:
awk ' ~ /^RQ/ { = ; $NF = -9} 1' file | column -t
136 471254 0 0 2 -0.487238289
137 472084 0 0 2 -0.324059074
138 471040 0 0 2 -0.199028334
139 472755 0 0 2 -9
140 471309 0 0 2 -9
RQ00245-7 RQ00245-7 0 0 2 -9
142 471311 0 0 2 2.593358921
143 472898 0 0 2 -0.525585159
144 471327 0 0 2 -9
145 471097 0 0 2 -0.20795088
146 472930 0 0 2 -9
RQ00255-5 RQ00255-5 0 0 2 -9
RQ002657-9 RQ002657-9 0 0 2 -9
详情:
~ /^RQ/
检查第二列是否以RQ
开头
= ; $NF = -9
:将第一个字段值设置为第二个字段并将最后一个字段设置为-9
column -t
已用于表格输出