[英]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 array
, gensub()
和\\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.