シェルコマンドを使用してテキストファイルの最初の列と最後の列のみを表示するにはどうすればよいですか?

シェルコマンドを使用してテキストファイルの最初の列と最後の列のみを表示するにはどうすればよいですか?

sedコマンドを使用して、テキストファイルの最初の列と最後の列のみを表示する方法を理解するのに役立ちます。これまでの私の最初の列は次のとおりです。

cat logfile | sed 's/\|/ /'|awk '{print $1}'

最後の列も表示したい私の弱い試みは次のとおりです。

cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'

ただし、これは最初の列と最後の列を取り、1つのリストにマージします。 sedコマンドとawkコマンドを使用して最初の列と最後の列を明確に印刷する方法はありますか?

入力例:

foo|dog|cat|mouse|lion|ox|tiger|bar

答え1

そこくらいです。 2つの列参照を1つにまとめるだけです。

cat logfile | sed 's/|/ /' | awk '{print $1, $8}'

また、ここでは必須ではありませんcat

sed 's/|/ /' logfile | awk '{print $1, $8}'

awkまた、列区切り文字は|空白ではなく、どちらも必要ないことがわかりますsed

awk -F '|' '{print $1, $8}' logfile

~によると提案渡すガレブ、正確に8でなくても、最後のフィールドを出力するソリューションが必要な場合に使用できます$NF

awk -F '|' '{print $1, $NF}' logfile

また|、出力でスペースを使用する代わりに区切り文字を保持したい場合は、出力フィールド区切り文字を指定できます。残念ながら、単にフラグを使用するよりも少し厄介ですが-F、これを行う3つの方法があります。

  • awkBEGINブロックに入力フィールドと出力フィールドの区切り文字自体を割り当てることができます。

    awk 'BEGIN {FS = OFS = "|"} {print $1, $8}' logfile
    
  • awkコマンドラインから呼び出すと、フラグを使用してこれらの変数を割り当てることができます-v

    awk -v 'FS=|' -v 'OFS=|' '{print $1, $8}' logfile
    
  • または簡単に:

    awk -F '|' '{print $1 "|" $8}' logfile
    

答え2

awkとにかく、あなたは以下を使用しています:

awk '{ print $1, $NF }' file

答え3

最初から最後まで(または必要に応じて空白)に|置き換えます。|

sed 's/|.*|/|/'

sed特別な実装はありません|が(拡大する-E一部の実装では、正規表現はアクティブではありません-r\|これはGNUなどの実装ではそれ自体が特別ですsed。だからあなたはしなければなりません。いいえ|文字と一致させるにはエスケープします|

スペースに置き換えると、入力にすでに1つしか含まれていない行が含まれる可能性があり、一致しないため、特に|処理する必要があります。|.*|それは次のとおりです。

sed 's/|\(.*|\)\{0,1\}/ /'

(該当部分がオプションになる場合でも.*|) または:

sed 's/|.*|/ /;s/|/ /'

または:

sed 's/\([^|]*\).*|/\1 /'

入力のフィールド数に関係なく、最初と8番目のフィールドが必要な場合は、次のようにします。

cut -d'|' -f1,8


(これはすべて、入力が有効なテキスト形式であると仮定すると、すべてのPOSIX互換ユーティリティで機能します。特に、sed入力に現在のシステムで有効な文字を形成しないバイトまたはバイトシーケンスがある場合、通常は機能しません。locale )役割(例:printf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'UTF-8ロケール)。

答え4

テキストの最初のフィールドと最後のフィールドを|

あなたのログファイルに次のテキストが含まれているとします。

foo|dog|cat|mouse|lion|ox|tiger|bar
bar|dog|cat|mouse|lion|ox|tiger|foo

希望の出力は次のとおりです。

foo bar
bar foo

もしそうなら、これはあなたの命令です

GNU sedを通じて、

sed -r 's~^([^|]*).*\|(.*)$~\1 \2~' file

例:

$ echo 'foo|dog|cat|mouse|lion|ox|tiger|bar' | sed -r 's~^([^|]*).*\|(.*)$~\1 \2~'
foo bar

関連情報