我有一个.dat文件,其中字段之间没有分隔符。
例如:2014HELLO2500
我必须将文件转换为逗号分隔文件,并在特定位置使用逗号
即2014年,HELLO,2500
我可以使用for循环转换文件。但是可以使用一个命令来完成。
我尝试使用cut命令的--output-delimiter选项。但它不起作用。
我正在使用AIX OS。
由于
答案 0 :(得分:2)
假设您的字段宽度已知,您可以使用gawk
,如下所示:
awk -v FIELDWIDTHS="4 5 4 ..." -v OFS=, '{print $1,$2,$3,$4,$5...}' file
答案 1 :(得分:1)
假设您知道字段的长度,例如,第一个字段为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
之后留下了很多字符。
假设您知道字段的长度,例如,第一个字段为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