簡體   English   中英

使用awk檢查一行中的多個位置以獲取數據

[英]Examine multiple locations in a line for data using awk

我試圖提取一些最初來自大型機的信息。 這些行全都是ASCII字符數據,但是每一行都被認為是多段的,因此具有不同的行長。 字段由長度定界。 該行中有一個字段,指示該行中可變部分應有多少段。 我要做的是在這些可變段中尋找指標的存在,並從中提取一些數據。

簡化示例如下所示;

UUID12345 1   ABC 1 345  
UUID23456 2   XYZ 4 763 ABC 4 678  
UUID34567 3   XYZ 4 763 ABC 2 456 QRS 2 456  
UUID45678 2   DEF 1 345 TUV 8 111 
UUID56789 0

第二列規定了期望的細分數。 可以有多達99個段,但在現實中,有小於10。在上面的例子中,每個段將包含起始於ABC對例如第一行中的位置的10個字節。 我要提取的是每行的第一列,以及包含ABC的任何段的后3個字符的值。

因此,上面一行的示例輸出為:

UUID12345 345  
UUID23456 678  
UUID34567 456
UUID45678 
UUID56789 

我知道一些非常基本的awk,可以查找一行的特定部分,但是不知道如何實現此目的。 例如,以下內容使我能夠提取第一行,但只能通過查看特定位置來進行提取,而無需考慮指示可變段數的第二列。

awk '{ if (substr($0, 0, 4)=="UUID" && substr($0, 15, 3)=="ABC") {print substr($0, 0, 9) " " substr ($0, 21,3)}}' <<< "UUID12345 1   ABC 1 345"

編輯

根據我在下面對Ed Morton的評論,這就是我最終對我有用的東西(其中test.txt是上面顯示的示例);

awk '{segs=substr($0, 11, 1); acc=substr($0, 1, 10); startCol=15; val=""; for(i=startCol; i<startCol+(10 * segs); i+= 10) if (substr($0, i, 3)=="ABC") val=substr($0, i + 6, 3); print acc " " segs " " val}' test.txt
$ awk '{val=""; for (i=3; i<NF; i+=3) if ($i=="ABC") val=$(i+2); print $1, val}' file
UUID12345 345
UUID23456 678
UUID34567 456
UUID45678
UUID56789

如果還不夠,那么請編輯您的問題,以提供更真實的代表性示例輸入/輸出,更好地滿足您的所有需求。

用awk的另一種方式:

awk -F'ABC' '{split($1,a," |\t");split($2,b," |\t");print a[1],b[3]}' infile

使用Perl

$ perl -lane ' ($x)=$_=~/\bABC\s+\S+\s+(\S+)/; print $F[0], " ", $x ' moose.txt
UUID12345 345
UUID23456 678
UUID34567 456
UUID45678
UUID56789

$ cat moose.txt
UUID12345 1   ABC 1 345
UUID23456 2   XYZ 4 763 ABC 4 678
UUID34567 3   XYZ 4 763 ABC 2 456 QRS 2 456
UUID45678 2   DEF 1 345 TUV 8 111
UUID56789 0

$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM