将具有单个字段的文件转换为多个逗号分隔的字段

时间:2016-05-10 07:01:28

标签: shell

我有一个.dat文件,其中字段之间没有分隔符。

例如:2014HELLO2500

我必须将文件转换为逗号分隔文件,并在特定位置使用逗号

即2014年,HELLO,2500

我可以使用for循环转换文件。但是可以使用一个命令来完成。

我尝试使用cut命令的--output-delimiter选项。但它不起作用。

我正在使用AIX OS。

由于

5 个答案:

答案 0 :(得分:2)

假设您的字段宽度已知,您可以使用gawk,如下所示:

awk -v FIELDWIDTHS="4 5 4 ..." -v OFS=, '{print $1,$2,$3,$4,$5...}' file

答案 1 :(得分:1)

使用awk

假设您知道字段的长度,例如,第一个字段为4个字符,第二个字段为5个字符,请尝试以下操作:

$ awk -v s='4 5' 'BEGIN{n=split(s,a)} {pos=1; for (i=1;i<=n;i++) {printf "%s,",substr($0,pos,a[i]); pos+=a[i]}; print substr($0,pos)}' file
2014,HELLO,2500

作为完全相同的代码但应用了许多字段的示例,请考虑以下测试文件:

$ cat alphabet
ABCDEFGHIJKLMNOPQRSTUVWXYZ

让我们把它分开:

$ awk -v s='1 2 3 2 1 2 3 2 1 2 3 2' 'BEGIN{n=split(s,a)} {pos=1; for (i=1;i<=n;i++) {printf "%s,",substr($0,pos,a[i]); pos+=a[i]}; print substr($0,pos)}' alphabet
A,BC,DEF,GH,I,JK,LMN,OP,Q,RS,TUV,WX,YZ

工作原理:

  • -v s='1 2 3 2 1 2 3 2 1 2 3 2'

    这会创建一个变量s,它定义除最后一个字段之外的所有字段的长度。 (无需指定最后一个字段的长度。)

  • BEGIN{n=split(s,a)}

    这将字符串变量s转换为一个数组,每个数字都作为数组的元素。

  • pos=1

    在每一行的开头,我们将位置变量pos初始化为值1

  • for (i=1;i<=n;i++) {printf "%s,",substr($0,pos,a[i]); pos+=a[i]}

    对于数组a中的每个元素,我们打印从位置pos开始所需的字符数,后跟逗号。每次打印后,我们增加位置pos,以便下一个打印将从下一个字符开始。

  • print substr($0,pos)

    我们打印行上的最后一个字段,但在位置pos之后留下了很多字符。

使用sed

假设您知道字段的长度,例如,第一个字段为4个字符,第二个字段为5个字符,请尝试以下操作:

$ sed -E 's/(.{4})(.{5})/\1,\2,/' file
2014,HELLO,2500

此方法一次最多可用于九个字段。要获得15个领域,需要两次通过。

答案 2 :(得分:0)

假设你想要一个字符和数字之间的分隔符,那么你可以使用它:

$ sed -r -e 's/([A-Za-z])([0-9])/\1,\2/g' -e 's/([0-9])([A-Za-z])/\1,\2/g' <<< "2014HELLO2500"
2014,HELLO,2500
$

答案 3 :(得分:0)

当数字和字符串交替时,您可以使用 echo&#34; 2014HELLO2500other_string121312Other_word10&#34; |

   sed 's/\([A-Za-z]\)\([0-9]\)/\1,\2/g; s/\([0-9]\)\([A-Za-z]\)/\1,\2/g'

答案 4 :(得分:0)

echo TEP_CHECK.20180627023645.txt | cut -d'.' -f2 | awk 'BEGIN{OFS="_"} {print substr($1,1,4),substr($1,5,2),substr($1,7,2),substr($1,9,2),substr($1,11,2),substr($1,13,2)}'

输出:

2018_06_27_02_36_45