Awk 从文件中提取股票代码

Awk 从文件中提取股票代码,awk,sed,Awk,Sed,以下三行是一个大型文本文件的摘录: 9 40 0.5752 2 0.0000 *BRK.B:23.42:24.08:-2.82% PFE:28.05:26.94:3.97% 9 40 0.5752 2 0.0000 *NOV:23.42:24.08:-2.82% 3 50 0.5752 7 0.

以下三行是一个大型文本文件的摘录:

9       40        0.5752        2        0.0000        *BRK.B:23.42:24.08:-2.82%        PFE:28.05:26.94:3.97%
9       40        0.5752        2        0.0000        *NOV:23.42:24.08:-2.82%
3       50        0.5752        7        0.0000        C:23.42:24.08:-2.82%             *AAPL:28.05:26.94:3.97%%       *MMM:28.05:26.94:3.97%  
我希望仅将股票代码符号提取到一列中,以便获得:

BRK.B
PFE
C
AAPL
MMM
NOV

我已经尝试使用sed和awk的组合,但似乎不能在同一行上允许可选的ticker。

您可能需要类似以下内容:

[A-Z.]+:\d

股票代码将存储在第1组中


对于特定示例,这是有效的:

$ grep -o '[[:upper:]][[:upper:].]*' infile
BRK.B
PFE
NOV
C
AAPL
MMM
即,任何大写字符,可选地后跟句点序列或大写字符-o只提取匹配项,每个输出行一个。

grep方法:

grep -Po '[[:upper:]]+(\.[[:upper:]]+)?' file
输出:

BRK.B
PFE
NOV
C
AAPL
MMM
试试这个-

$ awk '{for(i=1;i<=NF;i++) if($i ~ /[[:alnum:]]*%$/) {split($i,a,":"); gsub(/*/,"",a[1]);print a[1]}}' f
BRK.B
PFE
NOV
C
AAPL
MMM
@尝试:

将记录分隔符设置为空格。然后检查是否有任何行具有*或%或:如果是,则将整行中的*全局替换为NULL,然后将当前行中的*字符串替换为NULL。然后打印输入文件的行

awk '/*|%|:/{gsub(/:.*/,"");sub(/\*/,"");print}' RS=" "    Input_file