在awk中用制表符分隔的值

在awk中用制表符分隔的值,awk,Awk,如何从制表符分隔的字符串中选择第一列 # echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{print $1}' 上述操作将返回整条线路,而不仅仅是按照预期的方式进行加载 更新: 我需要更改选项卡中分隔值的第三列。 以下方法不起作用 echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $

如何从制表符分隔的字符串中选择第一列

# echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F'\t' '{print $1}'
上述操作将返回整条线路,而不仅仅是按照预期的方式进行加载

更新:

我需要更改选项卡中分隔值的第三列。 以下方法不起作用

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

确保它们是真正的标签!在bash中,可以使用C-v选项卡插入选项卡

您需要将OFS变量输出字段分隔符设置为选项卡:

echo "$line" | 
awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'
请确保在echo语句中引用$line变量,这是否可行

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

您可以设置字段分隔符:

... | awk 'BEGIN {FS="\t"}; {print $1}'
优秀阅读:

使用:

awk-vfs='\t'-vofs='\t'。。。 例如

我使用FS和OFS变量来操作以制表符分隔的绑定区域文件:

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

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

awk'BEGIN{FS=[\t]+};{print$1}'这就是我要找的。我的谷歌搜索正确吗由于这个评论,我发现:awk'BEGIN{FS=\t};{print$1,FS,$2,FS,$3}'myFile.txt以打印前三列的制表符分隔值。或者可以简单地使用awk'BEGIN{OFS=\t};{print$1、$2、$3}'GNU和BSD awk都支持-v来设置变量。在内联程序中使用BEGIN{FS=\t}是很难看的,您试图做出的任何开源贡献都可能遭到反对。只有在编写程序文件时才这样做。此外,不鼓励使用-F而不是-v FS=因为后者表明只设置FS,而不设置OFS。对最后一点的困惑首先导致了这篇文章。这就是为什么好的风格很重要。请,任何人都不应该做@Wok展示的事情。在输出中不枚举[Input]字段分隔符。您可以通过OFS变量指定输出字段分隔符。$'\t'中的$的用途是什么?回答我自己的问题:$'…'引用字符串扩展构造是一种使用转义八进制或十六进制值的机制…,例如quote=$'\042.@AmrMostafa,可惜该指南有误导性的解释,使人认为您不需要$'\t'中的$。更好:其中,$'…'是最常见的,其作用与单引号类似,只是反斜杠转义组合按照ANSI C标准的规定进行了扩展。事后看来,$'\t'是不必要的。awk理解字符串\t是一个制表符开源贡献者,请不要提交类似awk-F$'\t''BEGIN{OFS=FS}…'的内容。这应该是awk-vfs='\t'-vofs='\t'…'。这可能看起来很迂腐,但前后不一致会增加后来的贡献者引入错误的可能性,因为他们误解了您的代码。
... | awk 'BEGIN {FS="\t"}; {print $1}'
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