Unix 如何为固定长度文件中的每一列重复键值

Unix 如何为固定长度文件中的每一列重复键值,unix,text,awk,sed,flat-file,Unix,Text,Awk,Sed,Flat File,我必须在一行中每14个字符后重复键值 我的文件如下所示: KEYVALUE1 201604141111I201604141111C201604141111D201604141111E201604141111F KEYVALUE1 201604141111G KEYVALUE2 201604141111I201604141111C201604141111D201604141111E201604141111F KEYVALUE2 201604141111G201604141111F

我必须在一行中每14个字符后重复键值

我的文件如下所示:

KEYVALUE1 201604141111I201604141111C201604141111D201604141111E201604141111F  
KEYVALUE1 201604141111G  
KEYVALUE2 201604141111I201604141111C201604141111D201604141111E201604141111F  
KEYVALUE2 201604141111G201604141111F  
KEYVALUE3 201604141111I  
KEYVALUE4 201604141111G201604141111I  
我的输出应该是这样的

KEYVALUE1 201604141111I  
KEYVALUE1 201604141111C  
KEYVALUE1 201604141111D  
KEYVALUE1 201604141111F  
KEYVALUE1 201604141111G  
KEYVALUE2 201604141111I  
KEYVALUE2 201604141111C  
KEYVALUE2 201604141111D  
KEYVALUE2 201604141111F  
KEYVALUE2 201604141111G  
KEYVALUE2 201604141111F  
KEYVALUE3 201604141111I  
KEYVALUE4 201604141111G  
KEYVALUE4 201604141111I  

请帮助。

您可以尝试此
sed

sed -n '/^\([^ ]* \)\(.\{13\}\)/{s/^\([^ ]* \)\(.\{13\}\)/&\n\1/g;P;D;}' file

您可以尝试此
sed

sed -n '/^\([^ ]* \)\(.\{13\}\)/{s/^\([^ ]* \)\(.\{13\}\)/&\n\1/g;P;D;}' file
或者这个:

sed '{
  :j
  /^[^ ]* .\{13\}.\{13\}/ {
    h
    s/^\([^ ]*\) \(.\{13\}\)\(.*\)$/\1 \2/
    p
    x
    s/^\([^ ]*\) \(.\{13\}\)\(.*\)$/\1 \3/
    h
    b j
  }
}' file
或者这个:

sed '{
  :j
  /^[^ ]* .\{13\}.\{13\}/ {
    h
    s/^\([^ ]*\) \(.\{13\}\)\(.*\)$/\1 \2/
    p
    x
    s/^\([^ ]*\) \(.\{13\}\)\(.*\)$/\1 \3/
    h
    b j
  }
}' file

sed是对单个行的简单替换,仅此而已。为了软件的简单性、清晰性、健壮性、可移植性、效率和其他最理想的品质,您应该使用awk:

$ awk '{ while ($2!="") { print $1, substr($2,1,13); $2=substr($2,14) } }' file
KEYVALUE1 201604141111I
KEYVALUE1 201604141111C
KEYVALUE1 201604141111D
KEYVALUE1 201604141111E
KEYVALUE1 201604141111F
KEYVALUE1 201604141111G
KEYVALUE2 201604141111I
KEYVALUE2 201604141111C
KEYVALUE2 201604141111D
KEYVALUE2 201604141111E
KEYVALUE2 201604141111F
KEYVALUE2 201604141111G
KEYVALUE2 201604141111F
KEYVALUE3 201604141111I
KEYVALUE4 201604141111G
KEYVALUE4 201604141111I

sed是对单个行的简单替换,仅此而已。为了软件的简单性、清晰性、健壮性、可移植性、效率和其他最理想的品质,您应该使用awk:

$ awk '{ while ($2!="") { print $1, substr($2,1,13); $2=substr($2,14) } }' file
KEYVALUE1 201604141111I
KEYVALUE1 201604141111C
KEYVALUE1 201604141111D
KEYVALUE1 201604141111E
KEYVALUE1 201604141111F
KEYVALUE1 201604141111G
KEYVALUE2 201604141111I
KEYVALUE2 201604141111C
KEYVALUE2 201604141111D
KEYVALUE2 201604141111E
KEYVALUE2 201604141111F
KEYVALUE2 201604141111G
KEYVALUE2 201604141111F
KEYVALUE3 201604141111I
KEYVALUE4 201604141111G
KEYVALUE4 201604141111I

如果您对perl开放:

perl -lane 'print "$F[0] $_" for $F[1] =~/.{13}/g' file

如果您对perl开放:

perl -lane 'print "$F[0] $_" for $F[1] =~/.{13}/g' file

这很好,但是如果我有像KEYVALUE2 201604141111G201604141111F这样的数据,那么我会得到只有KEYVALUE2和空格的行,这不是我想要的。但仍然是一个很好的选择:)我也是一个SED迷:)这很好,但是如果我有像KEYVALUE2 201604141111G201604141111F这样的数据,那么我会得到只有KEYVALUE2和空格的行,这不是我想要的。但仍然是一个很好的选择:)我也是SED的粉丝:)谢谢ED。。这就像一块宝石:)我只是对位置做了一个小的编辑。它由13个字符改为14个字符。发布更改我的命令看起来像:awk'{while($2!=“”){print$1,substr($2,1,14);$2=substr($2,15)}'$FILE\u NAME>BREAK\u fileed。。这就像一块宝石:)我只是对位置做了一个小的编辑。它由13个字符改为14个字符。发布更改我的命令看起来像:awk'{while($2!=“”){print$1,substr($2,1,14);$2=substr($2,15)}'$FILE\u NAME>BREAK\u FILE