Bash文本文件格式

Age*_*Age 1 unix bash shell awk

我有一些文件格式如下:

555584280113;01-04-2013 00:00:11;0,22;889;30008;1501;sms;/xxx/yyy/zzz
552185022741;01-04-2013 00:00:13;0,22;889;30008;1501;sms;/xxx/yyy/zzz
5511965271852;01-04-2013 00:00:14;0,22;889;30008;1501;sms;/xxx/yyy/zzz
5511980644500;01-04-2013 00:00:22;0,22;889;30008;1501;sms;/xxx/yyy/zzz
553186398559;01-04-2013 00:00:31;0,22;889;30008;1501;sms;/xxx/yyy/zzz
555584280113;01-04-2013 00:00:41;0,22;889;30008;1501;sms;/xxx/yyy/zzz
558487839822;01-04-2013 00:01:09;0,22;889;30008;1501;sms;/xxx/yyy/zzz
Run Code Online (Sandbox Code Playgroud)

我需要在开头有一个10位数字的序列,删除第二列上的前缀55(我用简单的sed's/^ 55 // g'完成)并重新格式化日期看起来像这个:

0000000001;555584280113;20130401 00:00:11;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000002;552185022741;20130401 00:00:13;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000003;5511965271852;20130401 00:00:14;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000004;5511980644500;20130401 00:00:22;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000005;553186398559;20130401 00:00:31;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000006;555584280113;01-04-2013 00:00:41;0,22;889;30008;1501;sms;/xxx/yyy/zzz
Run Code Online (Sandbox Code Playgroud)

我有一个单独的日期部分:

cat file.txt | cut -d\; -f2 | awk '{print $1}' |awk -v OFS="-" -F"-" '{print $3$2$1}'
Run Code Online (Sandbox Code Playgroud)

它有效,但我不知道如何将它们全部放在一起,序列+ sed为前缀+更改日期格式.序列部分我甚至不知道该怎么做.

谢谢您的帮助.

jay*_*ngh 6

awk是用于文本解析和格式化的最佳工具之一.以下是满足您要求的一种方法:

awk '
BEGIN { FS = OFS = ";" }
{
    printf "%010d;", NR
    $1 = substr($1,3)
    split($2, tmp, /[- ]/)
    $2=tmp[3]tmp[2]tmp[1]" "tmp[4]
}1' file
Run Code Online (Sandbox Code Playgroud)

  • 我们将输入和输出字段分隔符设置为 ;
  • 我们使用printf格式化您的第一个列号要求
  • 我们使用substr函数删除第1列的前两个字符
  • 我们使用split函数来格式化时间
  • 使用1我们按原样打印其余的语句.

输出:

0000000001;5584280113;20130401 00:00:11;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000002;2185022741;20130401 00:00:13;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000003;11965271852;20130401 00:00:14;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000004;11980644500;20130401 00:00:22;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000005;3186398559;20130401 00:00:31;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000006;5584280113;20130401 00:00:41;0,22;889;30008;1501;sms;/xxx/yyy/zzz
0000000007;8487839822;20130401 00:01:09;0,22;889;30008;1501;sms;/xxx/yyy/zzz
Run Code Online (Sandbox Code Playgroud)