web-dev-qa-db-ja.com

テキストファイルから列2を切り取る

私のテキストファイルには、区切り文字にスペースのみを指定する区切り文字がありません。列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
15
riley

awkが最も簡単で、連続する複数のスペースを1つのスペースとして扱います。

awk '{print $2}' file

プリント

207
412
431

しかし、grepなどのタスク用に設計されていなくても、仕事を行う他の多くのツールがあります。

grep -Po '^[^ ]+[ ]+\K[^ ]+' file
13
jimmij

パイプを使用して、データ(例: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
6
aeiounix

@jimmijが言ったように、awk '{print $2}' fileが最も簡単な答えです。

何らかの理由でawkを使用したくない場合は、cutの使用を主張する場合、sedを使用して、2つ以上のスペースのすべてのインスタンスをカットにパイプする前の単一のタブ(cutのデフォルトの区切り文字):

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431
1
cas
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
0
Alok Tiwari

区切り文字として単一のスペースを引き続き使用できます。列が増えるだけです。 cut -d' ' -fに与える値を2から5に、またはおそらく6に増やします。目的の結果が得られるまで数値を増やします。

0
Ryder