【问题标题】:awk: print the first 11 columns (leaving out the last column)awk:打印前 11 列(省略最后一列)
【发布时间】:2014-01-08 21:50:46
【问题描述】:

我的 CSV 文件有 12 列(制表符分隔),我想打印前 11 列。我想出了以下 awk 代码,但它破坏了格式(不再有制表符分隔符)。我需要一些帮助来保持格式,同时只打印前 11 列。帮助表示赞赏。

awk '{for(i=1;i<12;i++)printf "%s",$i OFS}'

【问题讨论】:

  • 你试过cut吗?
  • awk '{for(i=1;i&lt;12;i++)printf "%s\t",$i OFS}' 呢?
  • 是的。 cut 可能更适合此目的。话虽如此,您需要将 OFS 设置为所需的分隔符(即制表符)。
  • @Rubens:是的,我尝试了“cut”,它有效。我只是想提高一点我的 awk 技能:)

标签: csv awk


【解决方案1】:

假设您希望每个输入字段之间有一个选项卡,这样的事情应该可以满足您的需求。

awk -vOFS='\t' '{NF=NF-1}1' $file

-vOFS='\t'OFS 设置为制表符。

NF=NF-1 告诉 awk 该行的字段比开始时少一个,并导致它重新计算 $0 的值。

1 模式的默认值为 print,因此请使用任何真值来打印 $0

尝试使用awk '{NF=NF-1}1' OFS='\t' $file,或者尝试使用awk 'BEGIN{OFS="\t"} {NF=NF-1}1' $file 来避免-v

【讨论】:

  • awk:-v 选项无效
  • @TonyGW,您的系统是否有:gawknawk/usr/xpg4/bin/awk
  • +1,但必须在文件名前指定 OFS。如果您执行awk {...} file1 OFS='\t' file2,那么OFS 将只设置为file2 的选项卡。
  • @WilliamPursell 对,对不起,我的转录错误(以及我没有注意到差异的错)。固定。
  • 你可以用NF-=1减去1
【解决方案2】:

一些awk变体

awk 'NF-=1' OFS=\\t $file
awk '{NF-=1}1' OFS=\\t $file
awk '{NF-=1}1' OFS="\t" $file
awk -v OFS="\t" '{NF-=1}1' $file

【讨论】:

  • 第一个将在空行上失败(负 NF 的 awk 错误,至少在 gawk 3.1.5 上),并且将完全删除只有一个字段的行(而不是打印一个空行作为可能需要)。
【解决方案3】:

如果你的系统上有 Ruby

# ruby -ne 'puts $_.split("\t")[0..10].join("\t")' file

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 2019-02-04
    • 2011-05-17
    • 2020-06-08
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    相关资源
    最近更新 更多