空格分隔文件处理

时间:2014-06-30 20:03:07

标签: regex awk sed

我在空格分隔文件中有公司的内幕交易。示例数据如下所示:

1 Gilliland Michael S January 2,2013 20,000 19
2 Still George J Jr January 2,2013 20,000 19
3 Bishkin S. James February 1,2013 150,000 21
4 Mellin Mark P May 28,2013 238,000 25.26

Col1是Serial#,我不需要打印
Col2是进行交易的人的名字。此列不一致。它有名字和第二名以及中间首字母,也有一些内部人员致敬(Mr Jr等先生) col3是日期格式月份日,年份
col4是交易的股票数量 col5是购买或出售股票的价格。

我需要你们帮助分别打印每个列值。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

计算读取的字段总数;它与非名称字段数之间的差异为您提供了名称的宽度。

#!/bin/bash
# uses bash features, so needs a /bin/bash shebang, not /bin/sh

# read all fields into an array
while read -r -a fields; do

  # calculate name width assuming 5 non-name fields
  name_width=$(( ${#fields[@]} - 5 ))
  cur_field=0

  # read initial serial number
  ser_id=${fields[cur_field]}; (( ++cur_field ))

  # read name
  name=''
  for ((i=0; i<name_width; i++)); do
    name+=" ${fields[cur_field]}"; (( ++cur_field ))
  done
  name=${name# } # trim leading space

  # date spans two fields due to containing a space
  date=${fields[cur_field]}; (( ++cur_field ))
  date+=" ${fields[cur_field]}"; (( ++cur_field ))

  # final fields are one span each
  num_shares=${fields[cur_field]}; (( ++cur_field ))
  price=${fields[cur_field]}; (( ++cur_field ))

  # print in newline-delimited form
  printf '%s\n' "$ser_id" "$name" "$date" "$num_shares" "$price" ""
done

运行如下(如果您将脚本保存为process):

./process <input.txt >output.txt

答案 1 :(得分:1)

perl可能会更容易一些。

perl -lane '
    @date = splice @F, -4, 2;
    @left = splice @F, -2, 2;
    splice @F, 0, 1;
    print join "|", "@F", "@date", @left
' file
Gilliland Michael S|January 2,2013|20,000|19
Still George J Jr|January 2,2013|20,000|19
Bishkin S. James|February 1,2013|150,000|21
Mellin Mark P|May 28,2013|238,000|25.26

您可以根据需要更改join中的分隔符。

答案 2 :(得分:0)

以下是使用awk

分隔的数据
awk '{c1=$1;c5=$NF;c4=$(NF-1);c3=$(NF-3)FS$(NF-2);$1=$NF=$(NF-1)=$(NF-2)=$(NF-3)="";gsub(/^ | *$/,"");c2=$0;print c1"|"c2"|"c3"|"c4"|"c5}' file
1|Gilliland Michael S|January 2,2013|20,000|19
2|Still George J Jr|January 2,2013|20,000|19
3|Bishkin S. James|February 1,2013|150,000|21
4|Mellin Mark P|May 28,2013|238,000|25.26

您知道您的数据在变量c1c5

或者更好地显示在这里:

awk '{c1=$1;c5=$NF;c4=$(NF-1);c3=$(NF-3)FS$(NF-2);$1=$NF=$(NF-1)=$(NF-2)=$(NF-3)="";gsub(/^ | *$/,"");c2=$0;print c1"|"c2"|"c3"|"c4"|"c5}' file | column -t -s "|"
1  Gilliland Michael S  January 2,2013   20,000   19
2  Still George J Jr    January 2,2013   20,000   19
3  Bishkin S. James     February 1,2013  150,000  21
4  Mellin Mark P        May 28,2013      238,000  25.26