【问题标题】:how to concatenate the content of a file with a increment of last number of the column如何以列的最后一个数字的增量连接文件的内容
【发布时间】:2021-12-12 04:11:53
【问题描述】:

我有一个包含一些内容的文件,需要重复第 n 次并添加最后一列号的增量。

Input content of a file:
TCTA    7   ccta    TCTA    1
TCTA    8   ccta    TCTA    1
TCTA    9   ccta    TCTA    1
TCTA    10  ccta    TCTA    1
TCTA    11  ccta    TCTA    1
TCTA    12  ccta    TCTA    1
TCTA    13  ccta    TCTA    1
TCTA    14  ccta    TCTA    1
TCTA    15  ccta    TCTA    1
TCTA    16  ccta    TCTA    1
TCTA    17  ccta    TCTA    1

Expected output:
TCTA    7   ccta    TCTA    1
TCTA    8   ccta    TCTA    1
TCTA    9   ccta    TCTA    1
TCTA    10  ccta    TCTA    1
TCTA    11  ccta    TCTA    1
TCTA    12  ccta    TCTA    1
TCTA    13  ccta    TCTA    1
TCTA    14  ccta    TCTA    1
TCTA    15  ccta    TCTA    1
TCTA    16  ccta    TCTA    1
TCTA    17  ccta    TCTA    1
TCTA    7   ccta    TCTA    2
TCTA    8   ccta    TCTA    2
TCTA    9   ccta    TCTA    2
TCTA    10  ccta    TCTA    2
TCTA    11  ccta    TCTA    2
TCTA    12  ccta    TCTA    2
TCTA    13  ccta    TCTA    2
TCTA    14  ccta    TCTA    2
TCTA    15  ccta    TCTA    2
TCTA    16  ccta    TCTA    2
TCTA    17  ccta    TCTA    2
TCTA    7   ccta    TCTA    3
TCTA    8   ccta    TCTA    3
TCTA    9   ccta    TCTA    3
TCTA    10  ccta    TCTA    3
TCTA    11  ccta    TCTA    3
TCTA    12  ccta    TCTA    3
TCTA    13  ccta    TCTA    3
TCTA    14  ccta    TCTA    3
TCTA    15  ccta    TCTA    3
TCTA    16  ccta    TCTA    3
TCTA    17  ccta    TCTA    3
TCTA    7   ccta    TCTA    n
TCTA    8   ccta    TCTA    n
TCTA    9   ccta    TCTA    n
TCTA    10  ccta    TCTA    n
TCTA    11  ccta    TCTA    n
TCTA    12  ccta    TCTA    n
TCTA    13  ccta    TCTA    n
TCTA    14  ccta    TCTA    n
TCTA    15  ccta    TCTA    n
TCTA    16  ccta    TCTA    n
TCTA    17  ccta    TCTA    n

我尝试关注但无法使最后一列增加第 n 次。

for i in {1..5};do 
   cat file.txt >> out.txt
done

我需要将最后一列增加 n 次。

【问题讨论】:

  • 输入文件是否保证最后一列的编号相同?该数字是否保证为一?如果数字不同,是否应该只重复行,直到最终数字增加到指定的最大值(即,某些行是否应该比其他行更多地出现在输出中)?
  • 在每次迭代中,您必须将行中的最后一个数字替换为当前序列号。因此,您不能使用 cat。相反,您必须 - 在 i 的每次迭代中 - 在输入文件的各行上编写一个显式循环,并为每一行调整该行的最后一个字段。

标签: bash shell awk sed echo


【解决方案1】:

使用 gnu-awk 解决方案:

awk -v n=3 '
{
   rec = rec $0 RS
}
1
END {
   for (i=2; i<=n; ++i)
      printf "%s", gensub(/[0-9]+(\n|$)/, i "\\1", "g", rec)
}' file

TCTA    7   ccta    TCTA    1
TCTA    8   ccta    TCTA    1
TCTA    9   ccta    TCTA    1
TCTA    10  ccta    TCTA    1
TCTA    11  ccta    TCTA    1
TCTA    12  ccta    TCTA    1
TCTA    13  ccta    TCTA    1
TCTA    14  ccta    TCTA    1
TCTA    15  ccta    TCTA    1
TCTA    16  ccta    TCTA    1
TCTA    17  ccta    TCTA    1
TCTA    7   ccta    TCTA    2
TCTA    8   ccta    TCTA    2
TCTA    9   ccta    TCTA    2
TCTA    10  ccta    TCTA    2
TCTA    11  ccta    TCTA    2
TCTA    12  ccta    TCTA    2
TCTA    13  ccta    TCTA    2
TCTA    14  ccta    TCTA    2
TCTA    15  ccta    TCTA    2
TCTA    16  ccta    TCTA    2
TCTA    17  ccta    TCTA    2
TCTA    7   ccta    TCTA    3
TCTA    8   ccta    TCTA    3
TCTA    9   ccta    TCTA    3
TCTA    10  ccta    TCTA    3
TCTA    11  ccta    TCTA    3
TCTA    12  ccta    TCTA    3
TCTA    13  ccta    TCTA    3
TCTA    14  ccta    TCTA    3
TCTA    15  ccta    TCTA    3
TCTA    16  ccta    TCTA    3
TCTA    17  ccta    TCTA    3

【讨论】:

  • 嗨 Anubhav 感谢它的工作(我需要安装;“brew install gawk”并仅使用 gawk 而不是 awk)。此外,我从未使用过 gensub 功能,请您解释一下,您的命令如何解释这种情况?谢谢
  • gensub 正在使用正则表达式 [0-9]+(\n|$) 搜索字符串 rec。这基本上是每行中的最后一个数字,并用i 替换它,它从2 迭代到n(\n|$) 是一个捕获组,用于捕获每个换行符或行尾,作为替换,我们只需使用反向引用 \\1 将其放回 i 之后。 "g" 用于全局替换。
  • Hey Anubhav 谢谢,如果我想在输入更改时扩展倒数第二列以及最后一列,您能帮我吗? TCTA 3 TCTG 1 TCTA 1TCTA 4 TCTG 1 TCTA 1
  • @SandeepKumar 很难从评论部分理解需求。如果您创建一个新问题并获得最好的帮助,那就更好了。
【解决方案2】:

这可能对你有用(GNU 并行和 sed):

parallel -kq sed -E 's/\S+$/$((&+{}))/;s/.*/echo "&"/e' file ::: {0..2}

如果您想用增量替换最后一个字段,请使用:

parallel -kq sed -E 's/\S+$/{}/' file ::: {1..3}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2016-08-08
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多