1

我正在尝试创建一个脚本来从文件中提取帐户代码。该文件本身很长并且包含许多其他数据,但我在下面包含了我正在查看的部分的摘录(在此摘录之前和之后还有其他内容)

我感兴趣的文件部分有时看起来像这样

  Account       Customer Order No.          Whse         Payment Terms          Stock No.          Original Invoice No.
                                                                                                       VIN No.
 AAAAAA01             9999                  1000             30 days

有时看起来像这样

  Account       Customer Order No.          Whse         Payment Terms          Stock No.          Original Invoice No.
 AAAAAA01             9999                  1000             30 days

(一个字段切断了末端,该字段一直缠绕到它自己的线上)

我知道| tr -s ' ' | cut -d ' ' -F 1一旦我有了它所在的行,我就可以使用它来拉取代码,但这不是一个设定的行号(本节之前的内容是动态的)。

我首先尝试使用额外字段处理案例,我认为将其作为可选匹配很容易?

用于分隔字段的空格数可以更改,因为这本质上是 OCRed。

到目前为止我的一些尝试 - (假设文件来自 STDIN)

| sed -n '/\s*Account\s\+Customer Order No\.\s\+Whse\s\+Payment Terms\s\+Stock No\.\s\+Original Invoice No\.\s\+VIN No\.\s*/{n;p;}'
| sed -n '/\s*Account\s\+Customer Order No\.\s\+Whse\s\+Payment Terms\s\+Stock No\.\s\+Original Invoice No\.\s*\n\s*VIN No\.\s*/{n;p;}'
| sed -n '/\s*Account\s\+Customer Order No\.\s\+Whse\s\+Payment Terms\s\+Stock No\.\s\+Original Invoice No\.\s*\r\s*VIN No\.\s*/{n;p;}'
| sed -n '/\s*Account\s\+Customer Order No\.\s\+Whse\s\+Payment Terms\s\+Stock No\.\s\+Original Invoice No\.\s*\r\n\s*VIN No\.\s*/{n;p;}'

这些都无法匹配

| sed -n '/\s*Account\s\+Customer Order No\.\s\+Whse\s\+Payment Terms\s\+Stock No\.\s\+Original Invoice No\.\s*/,/\s\*VIN No\.\s*/{n;p;}'

这至少匹配了一些东西,但令人沮丧地打印了 VIN 号行,然后每隔一行打印一次。似乎也更难标记为表达式的可选部分。

因此,给定完整文件的输入(包括上述任何一个摘录),我正在寻找任何一个的输出

AAAAAA01             9999                  1000             30 days

(然后我可以修剪到所需的数据)或者AAAAAA01是否有更简单的方法可以直接获取。

4

3 回答 3

3

这可能对您有用(GNU sed):

sed -n '/Account/{n;/VIN No\./n;p}' file

sed与开关一起使用-n,这使得 sed 的行为就像grep只使用命令P或 (这种情况)显式打印行p

  • /Account/将一行与模式匹配Account
  • 仅适用于上述比赛:
  • n通常这会打印当前行,然后将下一行读入模式空间,但由于-n正在运行,因此不会进行打印。所以现在模式空间包含下一行。
  • /VIN No\./n如果当前行包含Vin No有效地清空模式空间并读取下一行。
  • p打印当前在模式空间中的任何内容。

所以这是一个条件中的一个条件。当我们遇到Action打印以下行或之后的行时。

于 2013-06-07T06:11:36.543 回答
1
awk '/^\s*Account\s\+Customer Order No\.\s\+Whse\s\+Payment Terms\s\+Stock No\.\s\+Original Invoice No\.$/ { 
    getline;
    if (/^\s*VIN No\.$/) getline;
    print;
    exit;
}'
于 2013-06-10T23:06:32.677 回答
0

严格按照您的输入,在这两种情况下,所需的字段都在最后一行。所以要打印最后一行的第一个字段,

awk 'END {print $1}'

结果

AAAAAA01
于 2013-06-07T02:44:37.517 回答