【问题标题】:Extract specific columns from delimited file (long row to next line)从分隔文件中提取特定列(长行到下一行)
【发布时间】:2017-10-06 07:14:00
【问题描述】:

想要从分隔文件中提取 2 列 (delimiter '||') 如果在一行中像下面这样完整的行,可以很容易地在 unix 中完成

foo||bar||baz||quux

通过

cut -d'||' -f1 file_name

但在我的情况下,单行记录的文件记录转到下一行,例如:

foo||bar||baz||quux||foo||bar||baz||quux||foo||bar||baz||quux
||quux||bar||baz||quux||foo||bar||baz||quux||foo||bar||baz||quux

上面命令的输出是

foo
quux

应该只是“foo”,因为它在第一列。

文件包含在第 1 行中

foo||bar||baz||quux||foo||bar||baz||quux||foo||bar||baz||quux
||quux||bar||baz||quux||foo||bar||baz||quux||foo||bar||baz||quux

文件包含在第 2 行中

foo2||bar2||baz2||quux2||foo2||bar2||baz2||quux2||foo2||bar2||baz2||quux2
||quux2||bar2||baz2||quux2||foo2||bar2||baz2||quux2||foo2||bar2||baz2||quux2

输出应该是

foo
foo2

【问题讨论】:

  • 亲爱的,请把它编辑成可读的格式。
  • 我试图重申我错误理解的问题!
  • Re "错误理解":如果你运行的是 Linux,那么cut 命令来自 GNU coreutils我>。但是 GNUcut -d '||' 返回错误“cut: the delimiter must be a single character”,这意味着显示的 OP 代码一定不准确。如果这是真的,那么请更正帖子以显示正在运行的实际代码。

标签: linux shell unix awk scripting


【解决方案1】:

差不多,但是-d 开关只需要一个字符:

cut -d'|' -f1 file_name

输出:

foo
foo2

注意:由于分隔符是双倍的,如果字段编号大于 1-f 开关将无法按预期工作。一种处理方法是将字段调整为等于“2n-1”。所以要获取字段#3,请执行-f$(( (3*2) - 1 ))

【讨论】:

  • 我试图重申我错误理解的问题!
【解决方案2】:

使用 awk。由于它是所有其他记录的第一个字段 (NR%2),请使用:

$ awk -F\| 'NR%2{print $1}' file
foo
foo2

数据(四条记录):

$ cat file
foo||bar||baz||quux||foo||bar||baz||quux||foo||bar||baz||quux
||quux||bar||baz||quux||foo||bar||baz||quux||foo||bar||baz||quux
foo2||bar2||baz2||quux2||foo2||bar2||baz2||quux2||foo2||bar2||baz2||quux2
||quux2||bar2||baz2||quux2||foo2||bar2||baz2||quux2||foo2||bar2||baz2||quux2

有趣的现象是 mawk 接受 -F"\|\|" (双管道)作为分隔符,但 GNU awk 不接受。

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多