如何使用 shell 命令仅显示文本文件中的第一列和最后一列?

use*_*573 69 shell sed awk

我需要一些帮助来弄清楚如何使用 sed 命令仅显示文本文件中的第一列和最后一列。这是我到目前为止对第 1 列的内容:

cat logfile | sed 's/\|/ /'|awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

我试图让最后一列也显示出来的尝试是:

cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
Run Code Online (Sandbox Code Playgroud)

但是,这需要第一列和最后一列并将它们合并到一个列表中。有没有办法用 sed 和 awk 命令清楚地打印第一列和最后一列?

样本输入:

foo|dog|cat|mouse|lion|ox|tiger|bar
Run Code Online (Sandbox Code Playgroud)

Spa*_*awk 97

差不多好了。只需将两个列引用并排放置即可。

cat logfile | sed 's/|/ /' | awk '{print $1, $8}'
Run Code Online (Sandbox Code Playgroud)

另请注意,您不需要cat这里。

sed 's/|/ /' logfile | awk '{print $1, $8}'
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以看出awk列分隔符是|,而不是空格,因此您也不需要sed

awk -F '|' '{print $1, $8}' logfile
Run Code Online (Sandbox Code Playgroud)

按照建议通过迦勒,如果你想仍然输出最后一个字段,即使有不完全八个解决方案,你可以使用$NF

awk -F '|' '{print $1, $NF}' logfile
Run Code Online (Sandbox Code Playgroud)

此外,如果您希望输出保留|分隔符,而不是使用空格,您可以指定输出字段分隔符。不幸的是,它比仅使用-F标志更笨拙,但这里有三种方法。

  • 很好地分解了如何简化这个问题。您可以添加关于如何使用 `|` 作为输出分隔符而不是字符串连接的默认空间的注释。你也可以解释使用 `$NF` 而不是硬编码 `$8` 来获得最后一列。 (4认同)

jas*_*yan 21

awk无论如何您都在使用:

awk '{ print $1, $NF }' file
Run Code Online (Sandbox Code Playgroud)

  • 您是否不需要使用“-F\|”或类似的东西来指定输入字段分隔符(因为在这种情况下它似乎是“|”而不是空格)吗?如果他想对输出使用相同的分隔符怎么办? (4认同)
  • @michaelb958 我认为“显然”夸大了案例,只是一点点:) (3认同)

Sté*_*las 15

只需从第一个到最后|一个替换为|(或空格,如果您愿意):

sed 's/|.*|/|/'
Run Code Online (Sandbox Code Playgroud)

请注意,虽然没有sed实现 where|是特殊的(只要扩展的正则表达式没有通过-E-r在某些实现中启用),\|它本身在一些如 GNU 中是特殊的sed。所以,你应该逃避|,如果你想让它的匹配|字符。

如果用空格替换并且如果输入可能已经包含只有一个的行|,那么您必须特别对待它,因为|.*|它与那些不匹配。那可能是:

sed 's/|\(.*|\)\{0,1\}/ /'
Run Code Online (Sandbox Code Playgroud)

(即使.*|部分可选)或:

sed 's/|.*|/ /;s/|/ /'
Run Code Online (Sandbox Code Playgroud)

或者:

sed 's/\([^|]*\).*|/\1 /'
Run Code Online (Sandbox Code Playgroud)

如果你想要第一个和第八个字段而不管输入中的字段数,那么它只是:

cut -d'|' -f1,8
Run Code Online (Sandbox Code Playgroud)


(所有这些将与任何POSIX兼容的实用工作假设输入形式的有效文本(特别是sed那些通常不工作,如果输入有没有在当前的区域例如像形成有效字符字节字节或序列printf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'中UTF-8 语言环境))。


Tho*_*hor 10

如果您发现自己没有 awk 和 sed,则可以使用 coreutils 实现相同的目的:

paste <(           cut -d'|' -f1  file) \ 
      <(rev file | cut -d'|' -f1 | rev)
Run Code Online (Sandbox Code Playgroud)