如果使用 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. 我想在同一行的第 1 列中重复这个特定的 RQ ID。
  2. 我还想在所有情况下将同一行第 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 语句说明如果列 2RQ 开头,则将列 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 已用于表格输出