【问题标题】:Return middle of the text string返回文本字符串的中间
【发布时间】:2012-06-25 13:04:01
【问题描述】:

以下 awk 语句按预期工作。 它从由 | 分隔的文本文件中返回第 1、第 2 和最后 4 列

awk '{print $1,"|", $2,"|", $(NF-3), "|",$(NF-2), "|", $(NF-1),"|", $(NF)}'

我想返回中间的列。换句话说,我需要将以下行中的 $something 替换为可以使用的东西。

awk '{print $1, $2, $something, $(NF-3), $(NF-2) $(NF-1), $(NF)}'

可以有 3 到 11 列将替换 something 变量。

【问题讨论】:

  • 抱歉没有收到。 awk '{print $1, $2, $3, $(NF-3), $(NF-2) $(NF-1), $(NF)}'awk '{print $1, $2, $4, $(NF-3), $(NF-2) $(NF-1), $(NF)}' 有什么问题?
  • 我需要用 | 拆分文件7 列中的分隔符。
  • 您可以使用:'{ printf("%s|%s|%s|%s|%s|%s|%s|%s\n", $1, $2, $3, $(NF-3), $(NF-2) $(NF-1), $(NF); }'
  • ## awk: line 1: missing ) near ;
  • 请显示一些示例输入和所需的输出。

标签: awk


【解决方案1】:

我想我已经理解了您期望输出的样子。试试这行awk

awk 'BEGIN { OFS="|" } { for (i=1; i<=NF; i++) if (i <= 3 || i >= NF - 3) printf "%s"OFS, $i; else printf "%s", $i; print "" }' file.txt

测试输入:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14
Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 Y11 Y12 Y13 Y14
101 102 103 104 1010 1011 1012 1013 1014

测试输出:

1|2|3|4567891011|12|13|14
X1|X2|X3|X4X5X6X7X8X9X10X11|X12|X13|X14
Y1|Y2|Y3|Y4Y5Y6Y7Y8Y9Y10Y11|Y12|Y13|Y14
101|102|103|10410101011|1012|1013|1014

HTH

【讨论】:

  • 非常接近 # 测试输入是空格分隔而不是 |分隔 # 测试输出可能在第四列有空格。
  • @shantanuo,请考虑发布一些示例数据。您希望第四列中的空间在哪里?
  • 而不是一长串备选方案:if (i &lt;= 3 || i &gt;= NF - 3)
  • 不要使用巨大的单行,使用awk -f file.awk 并发布带有换行符的漂亮格式化脚本...
猜你喜欢
  • 2015-12-02
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
相关资源
最近更新 更多