选项卡以awk分隔值

时间:2011-03-21 05:43:52

标签: awk

如何从TAB分隔的字符串中选择第一列?

# echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F'\t' '{print $1}'

以上内容将返回整行,而不仅仅是“LOAD_SETTLED”。

更新

我需要更改制表符分隔值中的第三列。 以下不起作用。

echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt

如果分隔符是逗号而不是制表符,则此按预期工作。

echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt

6 个答案:

答案 0 :(得分:122)

您需要将OFS变量(输出字段分隔符)设置为标签:

echo "$line" | 
awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'

(确保引用echo语句中的$line变量)

答案 1 :(得分:18)

确保它们真的是标签!在bash中,您可以使用 C-v TAB

插入标签
$ echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F$'\t' '{print $1}'
LOAD_SETTLED

答案 2 :(得分:14)

You can set the Field Separator:

... | awk 'BEGIN {FS="\t"}; {print $1}'

Excellent read:

https://docs.freebsd.org/info/gawk/gawk.info.Field_Separators.html

答案 3 :(得分:5)

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'

答案 4 :(得分:5)

我使用FSOFS变量来操作以制表符分隔的BIND区域文件。这是我的一个脚本https://gist.github.com/RichardBronosky/abe1652c2d5c78c35b92ad02bdf0d0af#file-dns_update-sh-L36-L39

它的主要内容是:

awk -v FS='\t' -v OFS='\t' \
    -v record_type=$record_type \
    -v hostname=$hostname \
    -v ip_address=$ip_address '
$1==hostname && $3==record_type {$4=ip_address}
{print}
' $zone_file > $temp

这是一种简洁易读的方法。

答案 5 :(得分:1)

这应该不起作用吗?

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk '{print $1}'