我想使用awk for window拆分由制表符分隔的合并字段?

我想使用awk for window拆分由制表符分隔的合并字段?,awk,Awk,第5列和第17列中的字段合并在一起,我想拆分合并后的字段并放在单独的字段中。 我的数据是这样的 326502010-12-10 320100807 368902010-12-14 420100716 32650 2010-12-10 3 20100807 36890 2010-12-14 4 20100716 但我想看到这样的情景 326502010-12-10 320100807 368902010-12-14

第5列和第17列中的字段合并在一起,我想拆分合并后的字段并放在单独的字段中。 我的数据是这样的

326502010-12-10       320100807
368902010-12-14       420100716
32650       2010-12-10    3   20100807
36890       2010-12-14    4   20100716
但我想看到这样的情景

326502010-12-10       320100807
368902010-12-14       420100716
32650       2010-12-10    3   20100807
36890       2010-12-14    4   20100716

最好使用
sed
按字符分割:

$ sed -r 's/^(.{5})(.{18})/\1\t\2\t/' file
32650   2010-12-10       3  20100807
36890   2010-12-14       4  20100716

这将捕获给定的字符并将它们打印回来,中间有一个选项卡。

您也可以使用
cut
进行此操作:

$ cut --output-delimiter=$'\t' -c 1-5,6-17,18- file
32650   2010-12-10      3   20100807
36890   2010-12-14      4   20100716

使用
-c
选项,您可以设置一个列表,表示要剪切的线条部分。逗号
被设置为制表符的
--输出分隔符替换。

使用
awk

$ awk -vOFS="\t" '{sub(/.{5}/, "&\t", $1); sub(/./, "&\t", $2)}1' file
32650   2010-12-10  3   20100807
36890   2010-12-14  4   20100716

  • sub(/.{5}/,“&\t”,$1)
    将前5个字符替换为自身,然后在第一个字段上添加
    \t

  • sub(/./,“&\t”,$2)}
    替换第二个字段

  • 1
    此值始终为true,
    awk
    将输入行打印为默认操作


如果日期前的数字长度不同,请使用以下方法:

$ awk '{sub(/....-..-../,"\t&",$1); sub(/^./,"&\t",$2)} 1' file
32650   2010-12-10 3    20100807
36890   2010-12-14 4    20100716

sub
将日期部分替换为选项卡(
\t
)和匹配部分(
&
),即日期。第5列和第17列的
$2

的后面部分大致相同?你可能是说第五和第十七个角色,但我用的是awk。我期待着得到一个解决方案使用AWK然后开始张贴您的尝试。另外,这个sed代码很容易翻译成awk。嗨,这个脚本工作得很好,但是我的一些字段被扭曲了。拆分字段后如何避免扭曲字段?有没有可能修复该字段?谢谢