在第 n 个字符后拆分列

在第 n 个字符后拆分列

我试图在每 4 个字符之后分割下面文件中的第二列。

文件.txt

>1A    THISISATEST
>1B    THATISATEST

期望的输出:

>1A    THIS    ISATEST
>1B    THAT    ISATEST

经过搜索并尝试修改后,我尝试使用这个 sed 命令:sed 's/(.{4})(.{7}).*/\2 \3/' file.txt。但是,我似乎无法让它发挥作用。我错过了什么吗?但是,如果您有awk建议,那也会有所帮助。另外,请解释一下您的建议。我正在学习awk和的过程中sed

答案1

这是一个解决方案awk。它将前四个字符和第二列的其余部分分成两个变量并打印它们。

]$ awk '{s=substr($2,1,4)}{g=substr($2,5,length($2))}{print $1,s,g}' file.txt
1A THIS ISATEST
1B THAT ISATEST

答案2

sed

sed 's/^[^ ]\+ \+[^ ]\{4\}/&\t/'

怎么运行的:

  • ^: 行的开头
  • [^ ]\+: 没有空格字符至少匹配一次
  • \+: 空格字符至少匹配一次
  • [^ ]\{4\}:非空格字符恰好匹配四次
  • &: 之前的所有内容都匹配//
  • \t: 标签

输出:

>1A    THIS ISATEST
>1B    THAT ISATEST

正确的是:

sed 's/^[^ ][^ ]*  *[^ ]\{4\}/&\t/'

该模式+是GNU扩展,因此需要用重复字符和a来模拟它*以兼容posix。

答案3

sed 's/ [^ ]\{1,4\}/& /' <in >out

>1A    THIS ISATEST

它将起作用,插入一个<空格>在紧跟在空格字符后面的 1 到 4 个非空格字符序列第一次出现的最长匹配之后。这意味着如果该行以空格开头,它将影响第一个非空格序列(这可以说是正确的行为),否则如果第二个空格分隔列由四个或更少的字符组成,它将向该列附加一个额外的空格(这可以说是不正确的行为)

在任何情况下,它都不能代替空格每一个第二列中的第四个非空格字符,尽管它确实将示例输入转换为示例输出。

答案4

GNU awk您可以使用FPAT

awk '{$1=$1}1' OFS='\t' FPAT='>..\\s+\\w{4}|\\w*$'
  • 表达式>..\\s+\\w{4}匹配>1A THIS\\w*$匹配字符串的其余部分。

  • $1=$1强制使用新分隔符输出字符串OFS

  • 1是替代{print $0}

相关内容