[英]awk script not able to change field separator
我從這里獲取以下腳本
#!/usr/bin/awk -f
{
if ($0 ~ /:/) {
FS=":";
$0=$0;
} else {
FS=" ";
$0=$0
}
print $3
}
輸入文件
ONE 1 I
TWO 2 II
THREE:3:III
FOUR:4:IV
FIVE:5:V
SIX 6 VI
SEVEN 7 VII
我的輸出
I
II
IV
V
VII
所以我的問題是,為什么某些行缺少第三個字段?
您可以將FS設置為兩個字符
$ awk -F'[ :]' '{print $3}' file
要么
$ awk 'BEGIN{FS="[: ]"} {print $3}' file
如果需要的話,可以將單引號之間的部分移至腳本文件。
在AWK腳本中,記錄和字段分隔符用於拆分下一個字段。 這就是為什么通常將它們設置在BEGIN
子句中的原因。
如果需要根據當前字段的內容拆分當前內容,則必須使用split
功能,例如
arr_len = split($0, my_array, /:/);
if (arr_len > 3) {
print my_array[3]
} else {
....
}
我建議使用以下快速參考來提供幫助:
awk '
{
# force the FS
if ($0 ~ /:/) FS=":"
else FS=" "
# force awk to retreat the field separation with "new" line content
# because this is done at the start of the loop once (so earlier than)
# new FS assignation
$0 = $0
# print the 3th field
print $3
}
' YourFile
這是您在我的aix和linux上測試過的原始腳本改編版(差異通常不是其他結果的來源)。 兩者都正確地給出了第三個值。 您在哪個系統上?
假設您的樣本數據結構(沒有空格或“:”的混合),您可以通過類一次嘗試使用兩個分隔符(特別是對於mac問題)
awk -F '[: ]' '{ print $3 }' YourFile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.