【问题标题】:How to print Nth column of tabular data using bash only [duplicate]如何仅使用bash打印第N列表格数据[重复]
【发布时间】:2020-02-14 08:23:58
【问题描述】:

我有一个类似的变量

date="January 01 2019"

我想把它分成不同的变量,比如

month=$(echo $date|awk '{print $1}')

只是我想通过仅使用 bash 功能执行此操作来简化它。有什么办法吗?我可以告诉 bash 只打印变量的前 3 个字符

month=${date: 0: 7}

这在其他月份不起作用。
有没有办法做到这一点?

【问题讨论】:

  • 尝试:read month day year <<<"$date",然后是echo $year $month $day...
  • 感谢@F.Hauri,它是 bash 功能,但我正在寻找适合短线的短线

标签: bash


【解决方案1】:

您可以尝试关注。获取变量的第一部分。

echo ${date%% *}

来自man bash页面:

${parameter%word} ${parameter%%word} 移除匹配的后缀模式。 这个词被扩展以产生一个模式,就像在路径名中一样 扩张。如果模式匹配扩展的尾随部分 参数的值,那么展开的结果就是展开的 具有最短匹配模式的参数值(%'' case) or the longest matching pattern (the%%'' 案例)已删除。如果 参数为@或*,模式移除操作应用于每个 依次是位置参数,扩展是结果列表。 如果 parameter 是以 @ 或 * 为下标的数组变量,则模式 移除操作依次应用于数组的每个成员,并且 展开是结果列表。

【讨论】:

  • 不错。你能解释一下这背后的逻辑吗?它如何应用于打印其他列?
  • @TomasHrubovcak,欢迎您,这称为参数扩展。 % 用于最短匹配,%% 用于从给定模式中删除的最长匹配。
【解决方案2】:

是的。这是可能的。如果您确定没有前导空格。

$ date="January 01 2019"
$ echo ${date/%\ */}
January

手动

' \ * - 表示将 space01 2019 替换为空并打印。

【讨论】:

  • 赞赏,但绿色勾号的答案效果更好,并解释了原因
猜你喜欢
  • 2018-04-11
  • 2013-08-05
  • 2021-03-30
  • 1970-01-01
  • 2020-11-24
  • 2023-02-04
  • 2019-05-17
  • 2019-02-03
  • 1970-01-01
相关资源
最近更新 更多