我需要一些帮助来弄清楚如何使用 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标志更笨拙,但这里有三种方法。
您可以awk在 BEGIN 块中自行分配输入和输出字段分隔符。
awk 'BEGIN {FS = OFS = "|"} {print $1, $8}' logfile
Run Code Online (Sandbox Code Playgroud)您可以awk在从命令行调用时通过-v标志分配这些变量。
awk -v 'FS=|' -v 'OFS=|' '{print $1, $8}' logfile
Run Code Online (Sandbox Code Playgroud)或者干脆:
awk -F '|' '{print $1 "|" $8}' logfile
Run Code Online (Sandbox Code Playgroud)jas*_*yan 21
awk无论如何您都在使用:
awk '{ print $1, $NF }' file
Run Code Online (Sandbox Code Playgroud)
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)