选项卡以awk分隔值

sha*_*nuo 75 awk

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

# echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F'\t' '{print $1}'
Run Code Online (Sandbox Code Playgroud)

以上将返回整行,而不是按预期返回"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
Run Code Online (Sandbox Code Playgroud)

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

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

gle*_*man 125

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

echo "$line" | 
awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'
Run Code Online (Sandbox Code Playgroud)

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

  • 从[Advanced Bash Scripting Guide](http://tldp.org/LDP/abs/html/escapingsection.html)回答我自己的问题:$'...'引用的字符串扩展结构是一种使用转义的机制八进制或十六进制值...,例如,quote = $'\ 042'. (10认同)
  • 事后看来,'$'\ t'`是没有必要的.awk理解字符串`"\ t"`是一个制表符 (8认同)
  • $'\ t'中$的目的是什么? (6认同)
  • @AmrMostafa,太糟糕了,指南有一个误导性的解释导致人们认为你不需要'$'\ t'`中的`$`.[Greg的维基](http://mywiki.wooledge.org/Quotes)更好:"其中,'$'......'是最常见的,除了反斜杠转义的组合外,其作用就像单引号一样按照ANSI C标准的规定进行扩展". (4认同)
  • 开源贡献者,求求你,请不要提交像'awk -F $'\ t''BEGIN {OFS = FS} ......'这样的东西.这应该是'awk -v FS ='\ t'-v OFS ='\ t''...'`.它可能看起来很迂腐,但是不一致会增加后来贡献者引入错误的可能性,因为他们误解了你的代码. (3认同)

Mah*_*der 20

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

$ echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F$'\t' '{print $1}'
LOAD_SETTLED
Run Code Online (Sandbox Code Playgroud)


Joh*_*ian 15

您可以设置字段分隔符:

... | awk 'BEGIN {FS="\t"}; {print $1}'
Run Code Online (Sandbox Code Playgroud)

优秀阅读:

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


Bru*_*sky 6

我使用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
Run Code Online (Sandbox Code Playgroud)

这是一种干净且易于阅读的方法。


sha*_*nuo 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 }'
Run Code Online (Sandbox Code Playgroud)