フォーマットされたプロセスのリスト (上部の出力) があり、不要な情報を削除したいと考えています。たとえば、各行の 2 番目の単語 + 空白を削除するにはどうすればよいですか。
例:
1 a hello
2 b hi
3 c ahoi
abとcを削除したいです。
コマンドを使用できますcut
。
cut -d' ' -f2 --complement file
--complement
逆を行います。つまり、-f2
2 番目のフィールドが選択されました。そして、--complement
if は 2 番目を除くすべてのフィールドを出力します。これは、可変数のフィールドがある場合に便利です。
GNU のカットにはオプションがあります--complement
。--complement
が利用できない場合は、次のようにして同じことを行います。
カット -d'' -f1,3- ファイル
意味: 最初のフィールドを印刷してから、3 番目から最後まで印刷します。つまり、2 番目のフィールドを除外して、残りを印刷します。 編集:
必要に応じて、次のawk
ことができます。awk {$2=""; print $0}' file
これにより、秒が空に設定され、行全体が (1 つずつ) 出力されます。
を使用sed
して 2 番目の列を置き換えます。
sed -r 's/(\w+\s+)\w+\s+(.*)/\1\2/' file
1 hello
2 hi
3 ahoi
説明:
(\w+\s+) # Capture the first word and trailing whitespace
\w+\s+ # Match the second word and trailing whitespace
(.*) # Capture everything else on the line
\1\2 # Replace with the captured groups
注: オプションを使用して結果をに-i
保存します。これは拡張正規表現用です。実装によってはを確認してください。file
-r
man
-E
またはawk
、指定された列のみを印刷するために使用します。
$ awk '{print $1, $3}' file
1 hello
2 hi
3 ahoi
どちらのソリューションにもメリットがあります。awk
ソリューションは少数の固定数の列には適していますが、一時ファイルを使用して変更を保存する必要があります。これは、列が問題ではなく、オプションが編集を行うためawk '{print $1, $3}' file > tmp; mv tmp file
、sed
ソリューションがより柔軟であるためです。-i
場所。
これはうまくいくかもしれません(GNU sed):
sed -r 's/\S+\s+//2' file
バッシュの使用:
$ while read f1 f2 f3
> do
> echo $f1 $f3
> done < file
1 hello
2 hi
3 ahoi
を使用した片道sed
:
sed 's/ [^ ]*//' file
結果:
1 hello
2 hi
3 ahoi