用awk制表符分隔的值


90

如何从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

4
awk'BEGIN {FS =“ [\ t] +”}; {print $ 1}'#这就是我想要的。我的Google搜索正确吗?:)
shantanuo 2011年

3
由于此注释,我发现:awk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txt打印前三列的制表符分隔值。
炒锅

6
也许就是干脆awk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
Josiah Yoder

3
GNU和BSD awk都支持-v设置变量。BEGIN {FS="\t"}在内联程序中使用它是丑陋的,您尝试做出的任何开源贡献都可能会遭到反对。仅在编写程序文件时才这样做。另外,不建议使用-F而不是,-v FS=因为后者明确表明仅FS在设置而不是在设置OFS。关于最后一点的困惑是造成此帖子的首要原因。这就是“好风格”很重要的原因。
布鲁诺·布鲁诺斯基

1
拜托,没有人应该做@Wok演示的事情。您不会在输出中枚举[Input]字段分隔符。您可以通过OFS变量指定输出字段分隔符。
布鲁诺·布鲁诺斯基

Answers:


141

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

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

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


6
$'\ t'中的$的目的是什么?
Amr Mostafa

10
从《高级Bash脚本指南》回答我自己的问题:$'...'引用的字符串扩展构造是一种使用转义的八进制或十六进制值...的机制,例如quote = $'\ 042'。
Amr Mostafa

5
@AmrMostafa,太糟糕了,引导具有误导性的解释导致一至认为你这样做不是$$'\t'没有必要的。Greg的Wiki更好:“它们$'...'是最常见的,并且除了单引号转义的组合按ANSI C标准所指定的扩展外,其行为与单引号相同”。
Cristian Ciupitu 2014年

9
事后看来,$'\t'没有必要。awk将字符串理解"\t"为制表符
glenn jackman 2015年

5
开源贡献者,我求求你,请不要提交类似的内容awk -F $'\t' 'BEGIN {OFS = FS} …'。那应该是awk -v FS='\t' -v OFS='\t' '…'。看起来有些古怪,但不一致会增加后来的贡献者引入错误的机会,因为他们误解了您的代码。
布鲁诺·布鲁诺斯基

21

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

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



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 }'

0

这不行吗?

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk '{print $1}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.