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