我试图在每 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}