【问题标题】:Concatenate the content of a file with a increment of columns has 1 only将文件的内容与列的增量连接起来只有 1
【发布时间】:2021-12-13 20:51:38
【问题描述】:

在上一篇文章 (how to concatenate the content of a file with a increment of last number of the column) 的行中,我需要一些不同的问题的帮助。

现在我喜欢每列增加(1 到 5 次)(可以是第 2、第 3 ....nth,肯定会以“1”开头和结尾)除了第一列(可以从 1 开始,但以任意数字结尾)。

输入文件:

TCTA    3   TCTG    1   TCTA    1
TCTA    4   TCTG    1   TCTA    1
TCTA    5   TCTG    1   TCTA    1
TCTA    6   TCTG    1   TCTA    1
TCTA    7   TCTG    1   TCTA    1
TCTA    8   TCTG    1   TCTA    1
TCTA    9   TCTG    1   TCTA    1
TCTA    10  TCTG    1   TCTA    1
TCTA    11  TCTG    1   TCTA    1
TCTA    12  TCTG    1   TCTA    1
TCTA    13  TCTG    1   TCTA    1
TCTA    14  TCTG    1   TCTA    1
TCTA    15  TCTG    1   TCTA    1

需要输出:

TCTA    3   TCTG    1   TCTA    1
TCTA    4   TCTG    1   TCTA    1
TCTA    5   TCTG    1   TCTA    1
TCTA    6   TCTG    1   TCTA    1
TCTA    7   TCTG    1   TCTA    1
TCTA    8   TCTG    1   TCTA    1
TCTA    9   TCTG    1   TCTA    1
TCTA    10  TCTG    1   TCTA    1
TCTA    11  TCTG    1   TCTA    1
TCTA    12  TCTG    1   TCTA    1
TCTA    13  TCTG    1   TCTA    1
TCTA    14  TCTG    1   TCTA    1
TCTA    15  TCTG    1   TCTA    1
TCTA    3   TCTG    2   TCTA    2
TCTA    4   TCTG    2   TCTA    2
TCTA    5   TCTG    2   TCTA    2
TCTA    6   TCTG    2   TCTA    2
TCTA    7   TCTG    2   TCTA    2
TCTA    8   TCTG    2   TCTA    2
TCTA    9   TCTG    2   TCTA    2
TCTA    10  TCTG    2   TCTA    2
TCTA    11  TCTG    2   TCTA    2
TCTA    12  TCTG    2   TCTA    2
TCTA    13  TCTG    2   TCTA    2
TCTA    14  TCTG    2   TCTA    2
TCTA    15  TCTG    2   TCTA    2
TCTA    3   TCTG    3   TCTA    3
TCTA    4   TCTG    3   TCTA    3
TCTA    5   TCTG    3   TCTA    3
TCTA    6   TCTG    3   TCTA    3
TCTA    7   TCTG    3   TCTA    3
TCTA    8   TCTG    3   TCTA    3
TCTA    9   TCTG    3   TCTA    3
TCTA    10  TCTG    3   TCTA    3
TCTA    11  TCTG    3   TCTA    3
TCTA    12  TCTG    3   TCTA    3
TCTA    13  TCTG    3   TCTA    3
TCTA    14  TCTG    3   TCTA    3
TCTA    15  TCTG    3   TCTA    3
TCTA    3   TCTG    4   TCTA    4
TCTA    4   TCTG    4   TCTA    4
TCTA    5   TCTG    4   TCTA    4
TCTA    6   TCTG    4   TCTA    4
TCTA    7   TCTG    4   TCTA    4
TCTA    8   TCTG    4   TCTA    4
TCTA    9   TCTG    4   TCTA    4
TCTA    10  TCTG    4   TCTA    4
TCTA    11  TCTG    4   TCTA    4
TCTA    12  TCTG    4   TCTA    4
TCTA    13  TCTG    4   TCTA    4
TCTA    14  TCTG    4   TCTA    4
TCTA    15  TCTG    4   TCTA    4
TCTA    3   TCTG    5   TCTA    5
TCTA    4   TCTG    5   TCTA    5
TCTA    5   TCTG    5   TCTA    5
TCTA    6   TCTG    5   TCTA    5
TCTA    7   TCTG    5   TCTA    5
TCTA    8   TCTG    5   TCTA    5
TCTA    9   TCTG    5   TCTA    5
TCTA    10  TCTG    5   TCTA    5
TCTA    11  TCTG    5   TCTA    5
TCTA    12  TCTG    5   TCTA    5
TCTA    13  TCTG    5   TCTA    5
TCTA    14  TCTG    5   TCTA    5
TCTA    15  TCTG    5   TCTA    5

我尝试合并上一篇文章中的代码,但到目前为止没有成功..

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

这里的问题是它只需要最后一列,但是我需要除第一列之外的任何列。

请帮忙。

谢谢

【问题讨论】:

  • 总是第 4 列和第 6 列吗?
  • 在这种情况下是的..但可能会增加 8 和 10 之类的列....您可能会说偶数从 (4,6,8,10....) 开始

标签: bash shell awk sed


【解决方案1】:

假设:

  • 第一个数字列不包含单个数字1
  • 对于要递增的所有其他列,源/输入列的值为 1(即,我们只会递增包含单个 1 的列)
  • 最终结果:将所有出现的单个数字 1 替换为递增值
  • 事先不知道列数
  • 列数可能因行而异

修改 OP 的当前 awk 代码以将所有独立的 1's 替换为递增值:

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

地点:

  • ([^[:digit:]])1([^[:digit:]]) 匹配非数字字符(捕获组 #1)+ 单个 1 + 非数字字符(捕获组 #2)
  • "\\1" i "\\2" - 替换为捕获组 #1 + 当前增量值(在本例中为 i=2..5)+ 捕获组 #2
  • 我们执行 2 次 gensub() 调用以解决包含单个 1 的连续数字列的问题(注意:可能有一种方法可以通过单个函数调用来做到这一点,但我此刻我正在画一个空白……欢迎来自社区中awkers 的建议)

使用修改后的输入文件来演示连续数字列问题:

$ cat file
TCTA    3   TCTG    1   TCTA    1
TCTA    4   TCTG    1   TCTA    1
TCTA    5   TCTG    1   TCTA    1
TCTA    6   TCTG    1   TCTA    1
TCTA    7   TCTG    1   TCTA    1
TCTA    8   TCTG    1   TCTA    1
TCTA    9   TCTG    1   TCTA    1
TCTA    10  TCTG    1   TCTA    1
TCTA    11  TCTG    1   TCTA    1
TCTA    12  TCTG    1   TCTA    1
TCTA    13  TCTG    1   TCTA    1
TCTA    14  TCTG    1   TCTA    1 1 1
TCTA    15  TCTG    1   TCTA    1 1 1 1

这会生成:

TCTA    3   TCTG    1   TCTA    1
TCTA    4   TCTG    1   TCTA    1
TCTA    5   TCTG    1   TCTA    1
TCTA    6   TCTG    1   TCTA    1
TCTA    7   TCTG    1   TCTA    1
TCTA    8   TCTG    1   TCTA    1
TCTA    9   TCTG    1   TCTA    1
TCTA    10  TCTG    1   TCTA    1
TCTA    11  TCTG    1   TCTA    1
TCTA    12  TCTG    1   TCTA    1
TCTA    13  TCTG    1   TCTA    1
TCTA    14  TCTG    1   TCTA    1 1 1
TCTA    15  TCTG    1   TCTA    1 1 1 1
TCTA    3   TCTG    2   TCTA    2
TCTA    4   TCTG    2   TCTA    2
TCTA    5   TCTG    2   TCTA    2
TCTA    6   TCTG    2   TCTA    2
TCTA    7   TCTG    2   TCTA    2
TCTA    8   TCTG    2   TCTA    2
TCTA    9   TCTG    2   TCTA    2
TCTA    10  TCTG    2   TCTA    2
TCTA    11  TCTG    2   TCTA    2
TCTA    12  TCTG    2   TCTA    2
TCTA    13  TCTG    2   TCTA    2
TCTA    14  TCTG    2   TCTA    2 2 2
TCTA    15  TCTG    2   TCTA    2 2 2 2
TCTA    3   TCTG    3   TCTA    3
TCTA    4   TCTG    3   TCTA    3
TCTA    5   TCTG    3   TCTA    3
TCTA    6   TCTG    3   TCTA    3
TCTA    7   TCTG    3   TCTA    3
TCTA    8   TCTG    3   TCTA    3
TCTA    9   TCTG    3   TCTA    3
TCTA    10  TCTG    3   TCTA    3
TCTA    11  TCTG    3   TCTA    3
TCTA    12  TCTG    3   TCTA    3
TCTA    13  TCTG    3   TCTA    3
TCTA    14  TCTG    3   TCTA    3 3 3
TCTA    15  TCTG    3   TCTA    3 3 3 3
TCTA    3   TCTG    4   TCTA    4
TCTA    4   TCTG    4   TCTA    4
TCTA    5   TCTG    4   TCTA    4
TCTA    6   TCTG    4   TCTA    4
TCTA    7   TCTG    4   TCTA    4
TCTA    8   TCTG    4   TCTA    4
TCTA    9   TCTG    4   TCTA    4
TCTA    10  TCTG    4   TCTA    4
TCTA    11  TCTG    4   TCTA    4
TCTA    12  TCTG    4   TCTA    4
TCTA    13  TCTG    4   TCTA    4
TCTA    14  TCTG    4   TCTA    4 4 4
TCTA    15  TCTG    4   TCTA    4 4 4 4
TCTA    3   TCTG    5   TCTA    5
TCTA    4   TCTG    5   TCTA    5
TCTA    5   TCTG    5   TCTA    5
TCTA    6   TCTG    5   TCTA    5
TCTA    7   TCTG    5   TCTA    5
TCTA    8   TCTG    5   TCTA    5
TCTA    9   TCTG    5   TCTA    5
TCTA    10  TCTG    5   TCTA    5
TCTA    11  TCTG    5   TCTA    5
TCTA    12  TCTG    5   TCTA    5
TCTA    13  TCTG    5   TCTA    5
TCTA    14  TCTG    5   TCTA    5 5 5
TCTA    15  TCTG    5   TCTA    5 5 5 5

【讨论】:

  • 嗨,Markp 谢谢,这是可行的,但即使只分配 n = 5 然后只使用“n”而不是 n+1 循环也可以。如果我错了,请纠正我。我不确定你为什么在循环中有 n+1,请解释一下?
  • 你是对的,应该是n而不是n+1;我误以为n 表示要增加的 次数(即n=3 => 增加到2、3 和4)而不是n 表示最后一个增量值;我已经更新了答案以使用n=5
【解决方案2】:

可能是输出看起来不太好看,但最简单的应该是这样的:

awk -v n=5 '{ for(i=1;i<=n;++i) a[i,NR]=sprintf("%-8s%-4d%-8s%-4d%-8s%-4d",$1,$2,$3,i,$5,i) }
     END { for(i=1;i<=n;++i) for(j=1;j<=NR;++j) print a[i,j] }' file

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2019-05-29
    • 2021-12-12
    相关资源
    最近更新 更多