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


15

私のテキストファイルには、セパレーターだけのスペースを指定する区切り文字がありません。出力ファイルに列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

回答:


13

awk複数の連続したスペースを1つのスペースとして扱うのが最も簡単なので、

awk '{print $2}' file

プリント

207
412
431

しかし、明らかに次のようなタスクに設計されていなくても、仕事をする他の多くのツールがありますgrep

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

6

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

3
インカテーションcat ... |が必要になることはめったにありません。のようなほとんどのUnixコマンドはcut、1つ以上の入力ファイルを引数として取りますcut -d" " -f5 columns.txt
Denis Howe

1

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

何らかの理由でを使用awkしたくない場合はcut、を使用するようにsed要求する場合、を使用して、cutcutにパイプする前に、2つ以上のスペースのすべてのインスタンスを単一のタブ(のデフォルトの区切り文字)に変換できます。

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431

0

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


0
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

1
このawk例で「動作しない」唯一の理由は、ヒアドキュメントが引用符で囲まれてい$2ないことです。つまり、シェルによって2番目の位置パラメータに展開されます。解決策はおそらくgrepコマンドに切り替えるのではなく、$in $2asをエスケープするか、の代わりに\$2を使用<<'EOF'してドキュメント全体を単に引用することです<<EOF。また、この例のタスクはにより簡単に実行されることに注意してくださいpgrep
Kusalananda

@Kusalanandaに感謝します。それは魅力のように働きました。
Alok Tiwari
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.