私のテキストファイルには、区切り文字にスペースのみを指定する区切り文字がありません。列2を出力ファイルに切り出すにはどうすればよいですか。
39 207 City and County of San Francisc REJECTED MAT = 0
78 412 Cases and materials on corporat REJECTED MAT = 0
82 431 The preparation of contracts an REJECTED MAT = 0
だから私が必要な出力は
207
412
432
awk
が最も簡単で、連続する複数のスペースを1つのスペースとして扱います。
awk '{print $2}' file
プリント
207
412
431
しかし、grep
などのタスク用に設計されていなくても、仕事を行う他の多くのツールがあります。
grep -Po '^[^ ]+[ ]+\K[^ ]+' file
パイプを使用して、データ(例:cat columns.txt)をカットに送信します。
cat columns.txt | cut -d" " -f5
指定したサンプルデータでは、単一のスペース区切り文字が必要なデータをフィールド5に配置します。その出力を別のファイルに送信するには、リダイレクトを使用します。
cat collumns.txt | cut -d" " -f5 > field2.txt
Awkコマンドを使用すると、データがあるため、後のフィールドを自動的に認識する以下のようなことができます(?)awkについて詳しく知る必要があります。
awk -F' ' '{print $2}' columns.txt
@jimmijが言ったように、awk '{print $2}' file
が最も簡単な答えです。
何らかの理由でawk
を使用したくない場合は、cut
の使用を主張する場合、sed
を使用して、2つ以上のスペースのすべてのインスタンスをカットにパイプする前の単一のタブ(cut
のデフォルトの区切り文字):
$ sed -e 's/ \+/\t/g' riley.txt | cut -f2
207
412
431
grep -Po '^[^ ]+[ ]+\K[^ ]+' file
上記の1つは、以下のようなシェルスクリプト内で「root」ユーザーに変更する場合に、データ抽出用のawkなどのLinuxユーティリティが機能しない場合に非常に役立ちます。
Sudo -i <<EOF
ps aux | grep -E -i "[l]js" |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js" | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF
区切り文字として単一のスペースを引き続き使用できます。列が増えるだけです。 cut -d' ' -f
に与える値を2から5に、またはおそらく6に増やします。目的の結果が得られるまで数値を増やします。