6
A
回答
1
這實際上是相當困難的。我想出了以下awk
腳本手動分割線與存儲陣列中的所有領域。
{
s = $0
i = 0
split("", a)
while ((m = match(s, /"[^"]*"/)) > 0) {
# Add all unquoted fields before this field
n = split(substr(s, 1, m - 1), t)
for (j = 1; j <= n; j++)
a[++i] = t[j]
# Add this quoted field
a[++i] = substr(s, RSTART + 1, RLENGTH - 2)
s = substr(s, RSTART + RLENGTH)
if (i >= 3) # We can stop once we have field 3
break
}
# Process the remaining unquoted fields after the last quoted field
n = split(s, t)
for (j = 1; j <= n; j++)
a[++i] = t[j]
print a[3]
}
+0
這是很複雜的解決方案。如果沒有簡單*一個行*的解決方案,我會去的perl – mmonem 2010-08-11 18:10:46
6
下次顯示您的輸入文件和所需的輸出。爲了得到引述領域,
$ cat file
field1 field2 "field 3" field4 "field5"
$ awk -F'"' '{for(i=2;i<=NF;i+=2) print $i}' file
field 3
field5
1
這裏是一個可能的替代辦法解決這個問題。它通過查找以引號開頭或結尾的字段,然後將它們結合在一起來工作。在結束它更新的領域和NF,所以如果你把更多的模式,不合並一前一後,您可以使用過程一切正常awk的功能(新)領域。
我覺得這個使用POSIX awk中的唯一功能,不依賴於gawk的擴展,但我不能完全肯定。
# This function joins the fields $start to $stop together with FS, shifting
# subsequent fields down and updating NF.
#
function merge_fields(start, stop) {
#printf "Merge fields $%d to $%d\n", start, stop;
if (start >= stop)
return;
merged = "";
for (i = start; i <= stop; i++) {
if (merged)
merged = merged OFS $i;
else
merged = $i;
}
$start = merged;
offs = stop - start;
for (i = start + 1; i <= NF; i++) {
#printf "$%d = $%d\n", i, i+offs;
$i = $(i + offs);
}
NF -= offs;
}
# Merge quoted fields together.
{
start = stop = 0;
for (i = 1; i <= NF; i++) {
if (match($i, /^"/))
start = i;
if (match($i, /"$/))
stop = i;
if (start && stop && stop > start) {
merge_fields(start, stop);
# Start again from the beginning.
i = 0;
start = stop = 0;
}
}
}
# This rule executes after the one above. It sees the fields after merging.
{
for (i = 1; i <= NF; i++) {
printf "Field %d: >>>%s<<<\n", i, $i;
}
}
上的輸入文件,如:
thing "more things" "thing" "more things and stuff"
它產生:
Field 1: >>>thing<<<
Field 2: >>>"more things"<<<
Field 3: >>>"thing"<<<
Field 4: >>>"more things and stuff"<<<
0
如果你只是尋找一個特定的字段,則
$ cat file
field1 field2 "field 3" field4 "field5"
awk -F"\"" '{print $2}' file
作品。它通過拆分」的文件,所以在上面的例子中,第二場是一個你想要的。
相關問題
- 1. 使用AWK提取列
- 2. 提取文本使用awk
- 3. 使用Python提取字段
- 4. 如何使用awk引用文件名?
- 5. 如何分隔字段並用awk
- 6. 使用分段查詢提取字段
- 7. awk提取關鍵字行
- 8. 使用sed,awk或grep提取數據
- 9. 提取2組使用grep或awk的
- 10. 使用AWK提取和填充列
- 11. 使用awk從html中提取數據
- 12. 使用awk來提取一個Makefile
- 13. 使用AWK重新命名字段
- 14. 如何使用mongodb-erlang索引字段
- 15. 使用HIVE從JSON中提取字段
- 16. 使用名稱提取字段的ID
- 17. 如何使用grep/regex/cut/awk/sed等提取drbd狀態
- 18. 如何使用awk比較和替換字段
- 19. 如何使用AWK顛倒字段的順序?
- 20. 如何使用awk將多個空字段替換爲零
- 21. 如何使用「:」作爲awk字段分隔符?
- 22. 如何使用awk
- 23. 如何使用AWK
- 24. 查詢使用AWK/egrep的提取特定字符串
- 25. 使用sed/grep/awk從流中提取數字
- 26. 如何使用awk獲取鍵值對?
- 27. 如何在Wireshark中使用Lua字段提取器?
- 28. 如何使用.Net從create sql statment中提取所有字段?
- 29. 如何使用XSLT 1.0從此XML中提取字段?
- 30. 如何使用java提取Postgres時間戳字段?
顯示輸入文件format..and所需輸出! – ghostdog74 2010-08-11 15:03:26