簡體   English   中英

使用awk / sed根據模式在行中獲取特定數據,並在UNIX中將它們排列在列中

[英]Use of awk/sed to get specific data in rows based on a pattern and arrange them in columns in unix

我有一個文件如下:

ID: 1  
Name: Admin1  
Class: Administrator  
Class: Leader  
AliasName: User1  
AliasedObject: Administrator,Admin1  

ID: 2  
Name: Admin2  
Class: Administrator  
Class: Leader  
AliasName: User2  
AliasedObject: Administrator,Admin2  

ID: 3  
Name: Admin3  
Class: Administrator  
Class: Leader  
AliasName: User3  
AliasedObject: Administrator,Admin3  

現在,我只需要過濾AliasName和AliasedObject,如下所示:

AliasName  AliasedObject  
User1      Administrator,Admin1  
User2      Administrator,Admin2  
User3      Administrator,Admin3  

如何在Unix中使用AWK / SED命令執行此操作?

每當您的數據包含名稱=值對時,最好創建一個name2value數組並按其名稱訪問字段,例如:

$ cat tst.awk
BEGIN {
    RS=""; FS="\n"; OFS="\t"
    numNames = split("AliasName AliasedObject",names,/ /)
    for (i=1; i<=numNames; i++) {
        printf "%s%s", names[i], (i<numNames?OFS:ORS)
    }
}
{
    delete n2v
    for (i=1;i<=NF;i++) {
        name  = gensub(/:.*/,"","",$i)
        value = gensub(/[^:]+:\s*/,"","",$i)
        n2v[name] = value
    }
    for (i=1; i<=numNames; i++) {
        printf "%s%s", n2v[names[i]], (i<numNames?OFS:ORS)
    }
}
$ awk -f tst.awk file
AliasName       AliasedObject
User1   Administrator,Admin1
User2   Administrator,Admin2
User3   Administrator,Admin3

這樣,如果您想添加以后要打印的其他字段,只需將split("AliasName AliasedObject",names,/ /)更改為split("AliasName AliasedObject Class",names,/ /)或其他任何內容(但具有2個不同的字段)如果數據中確實存在這兩個問題,那么這兩個問題都應該在源頭解決)。

上面的代碼使用GNU awk進行了幾個擴展( delete arraygensub()\\s ),但是如果需要的話,可以很容易地對其進行調整以適用於任何awk。

雖然上述方法通常是最好的方法,但在這種情況下,如果您的輸入文件值不包含空格,我將只使用@fedorqui的簡潔解決方案: https ://stackoverflow.com/a/29698956/1745001。

假設文件就是這樣,您可以將記錄分隔符設置為該段(即RS="" ,感謝Ed Morton),然后獲取包含一些數據的塊:

awk 'BEGIN{RS=""; print "AliasName","AliasedObject"}
     {print $10, $12}' file

測試

$ awk 'BEGIN{RS=""; print "AliasName","AliasedObject"} {print $10,$12}' a
AliasName AliasedObject
User1 Administrator,Admin1
User2 Administrator,Admin2
User3 Administrator,Admin3
sed -n '1 i\
AliasName AliasedObject
/^AliasName/ { 
   s/.*:[[:space:]]*//
   N
   s/.AliasedObject:[[:space:]]*/    /p
   }' YourFile
  • 假設文件具有相同的記錄結構
  • 加載預期字段線,重新格式化並添加下一個。 僅在第二次圖案修改發生時打印( 安全性較低
#!/usr/bin/perl -ln

BEGIN{ $/='';  print "AliasName\tAliasedObject";}

%F = m/(?:^|\n)(\S+):\s*(.*)/g;
print "$F{AliasName}   $F{AliasedObject}"

這樣,某些字段可以為空,不存在或以不同順序寫入。

暫無
暫無

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

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