【问题标题】:Taking x number of last columns from a file in awk从 awk 中的文件中获取 x 个最后一列
【发布时间】:2017-02-13 21:08:38
【问题描述】:

我有一个 txt 文件,其中包含姓名、职位、部门等列。我需要从每列中获取某些字符,以便为每个列表生成用户名和密码。

我通过首先将列分开来解决这个问题:

awk 'NR>10{print $1, $2, $3, ...etc}' $filename
#This skips the header information and simply prints out each specified column.

然后继续从各自的字段中获取我需要的每个字符。

现在的问题是每一行都不统一。例如,列表是这样组织的:

(lastName, firstName, middleInitial, position, departmentName)

文本文件中的某些条目没有某些字段,例如中间名首字母。因此,当我尝试列出字段 3、4 和 5 时,没有中间首字母的条目返回:

(position, departmentName, empty/null (I'm not sure how awk handles this))

好消息是我不需要中间的首字母,所以我可以忽略这些列表。如何从文件中获取最后 2 列(在此示例中),以便我可以隔离 每个 条目所具有的字段,以便从中删除必要的字符?

【问题讨论】:

  • 您能否添加一些示例数据以进行测试、预期结果以及您使用到目前为止编写的代码获得的结果(即使它是一个错误)?哦,还有代码本身,尽可能接近可运行状态。查看MCVE 说明以获取提示。祝你好运!
  • 哇,我真的需要一些格式化帮助

标签: bash unix awk


【解决方案1】:

您可以通过$(NF-1)$NF 获取它们,它们是最后一列和最后一列

echo "1,2,3,4" | awk -F,  'BEGIN{OFS=","}{print $(NF-1), $NF}'

NF 表示字段数。如果你有 4 个字段。 (NF-1) 将是第 3 列,$(NF-1) 是第 3 列的值。

输出将是 3,4

文件中具有不同长度字段的另一个示例: 样本.csv

1,2,3,4,5
a,b,c,d

运行

awk -F,  'BEGIN{OFS=","}{print $(NF-1), $NF}' sample.csv 

输出:

4,5
c,d

【讨论】:

  • 这是否独立地获取每一行的最后一个字段?因此,如果一行总共有 4 个字段,而另一行总共有 5 个字段,那么 $NF 将在第一行占据第 4 个,在第二行占据第 5 个?
  • @LukeDangerKozorosky 是的,是的。在答案中查看我的第二个示例
  • 这太棒了!现在,由于我正在读取文件而不是回显文字值,因此使用 head 命令摆脱顶部的垃圾而不是尝试将某些字段通过管道传递到该命令中会更有益吗?示例:不要使用 awk 'NR>10{print $1, $2, $3, ...etc}' $filename 并给出特定列,而是使用 head 跳过前 10 行并读取其余数据?跨度>
  • @LukeDangerKozorosky 在我的第二个示例中,命令处理文件
  • 完美!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-09-21
  • 2023-03-10
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多