326

列ベースの「スペース」調整されたテキストストリームから特定の(4番目の)フィールドを抽出しようとしています。cut次のようにコマンドを使用しようとしています。

cat text.txt | cut -d " " -f 4

残念ながら、cut複数のスペースを1つの区切り文字として扱いません。私はawkをパイプでつなぐことができた

awk '{ printf $4; }'

またはsed

sed -E "s/[[:space:]]+/ /g"

cutスペースを折りたたむために、しかし、ネイティブに対処する方法といくつかの区切り文字があるかどうか知りたいですか?

4

5 に答える 5

575

試す:

tr -s ' ' <text.txt | cut -d ' ' -f4

trマニュアルページから:

-s、-squeeze-repeatsは、繰り返される文字の各入力シーケンスを置き換えます
                        これは、SET1に1回出現してリストされています
                        そのキャラクターの
于 2010-12-19T16:22:01.003 に答える
100

あなたがあなたの質問にコメントするように、それawkは本当に行く方法です。kevの答えが示すように、スペースを絞るためにcut一緒に使用することが可能です。tr -s

ただし、将来の読者のために、考えられるすべての組み合わせについて説明します。説明はテストセクションにあります。

tr | 切る

tr -s ' ' < file | cut -d' ' -f4

awk

awk '{print $4}' file

bash

while read -r _ _ _ myfield _
do
   echo "forth field: $myfield"
done < file

sed

sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' file

テスト

このファイルを前提として、コマンドをテストしてみましょう。

$ cat a
this   is    line     1 more text
this      is line    2     more text
this    is line 3     more text
this is   line 4            more    text

tr | 切る

$ cut -d' ' -f4 a
is
                        # it does not show what we want!


$ tr -s ' ' < a | cut -d' ' -f4
1
2                       # this makes it!
3
4
$

awk

$ awk '{print $4}' a
1
2
3
4

bash

これにより、フィールドが順番に読み取られます。を使用することにより_、これらのフィールドを無視するための「ジャンク変数」として、これが使い捨て変数であることを示します。このように$myfieldして、ファイル間のスペースに関係なく、ファイルの4番目のフィールドとして保存します。

$ while read -r _ _ _ a _; do echo "4th field: $a"; done < a
4th field: 1
4th field: 2
4th field: 3
4th field: 4

sed

これは、スペースの3つのグループをキャッチし、。を含むスペースはキャッチしません([^ ]*[ ]*){3}。次に、4番目のフィールドとしてスペースまで来るものをすべてキャッチし、最終的に。で印刷され\1ます。

$ sed -r 's/^([^ ]*[ ]*){3}([^ ]*).*/\2/' a
1
2
3
4
于 2014-09-23T10:27:46.190 に答える
27

最短/最もフレンドリーなソリューション

の制限が多すぎることに不満を感じた後cut、私は自分自身の代替品を書き、それをcuts「ステロイドの削減」と呼びました。

カットは、これおよび他の多くの関連するカット/ペーストの問題に対する最も最小限の解決策である可能性が高いものを提供します

この特定の質問に対処する多くの例のうちの1つの例:

$ cat text.txt
0   1        2 3
0 1          2   3 4

$ cuts 2 text.txt
2
2

cutsサポート:

  • ファイル内の最も一般的なフィールド区切り文字の自動検出(+デフォルトをオーバーライドする機能)
  • multi-char、mixed-char、およびregexが一致する区切り文字
  • 区切り文字が混在する複数のファイルから列を抽出する
  • 行の先頭に加えて、行の終わりからのオフセット(負の数を使用)
  • 列の自動サイドバイサイド貼り付け(paste個別に呼び出す必要はありません)
  • フィールドの並べ替えのサポート
  • ユーザーが個人設定を変更できる構成ファイル
  • 使いやすさと最小限のタイピングに重点を置いています

とはるかに。いずれも標準では提供されていませんcut

参照:https ://stackoverflow.com/a/24543231/1296044

ソースとドキュメント(フリーソフトウェア):http ://arielf.github.io/cuts/

于 2014-07-03T01:04:29.147 に答える
4

このPerlワンライナーは、Perlがawkとどれほど密接に関連しているかを示しています。

perl -lane 'print $F[3]' text.txt

ただし、@F自動分割配列はインデックスで始まり、$F[0]awkフィールドはで始まります$1

于 2015-09-09T17:16:04.660 に答える
3

私が知っているバージョンでcutは、いいえ、これは不可能です。cut主に、区切り文字が空白ではなく(たとえば/etc/passwd)、フィールド数が固定されているファイルを解析する場合に役立ちます。行の2つの区切り文字は空のフィールドを意味し、それは空白にも当てはまります。

于 2010-11-10T10:37:21.843 に答える