web-dev-qa-db-ja.com

指定された文字で始まる名前のファイルから行を抽出します

次のように、列のリストを取得します。

59  LOUIS   1202    +1
60  FREDDIE 1201    +4
61  FINLAY  1200    -2
62  LEON    1137    +12
63  HARLEY  1132    +6
64  DAVID   1127    -1
65  MOHAMMAD1100    +6
66  REECE   1095    -1
67  KIAN    1090    0
68  KAI     1056    -6
69  KYLE    1030    -18
70  BRANDON 1011    -4
71  HAYDEN  1006    +5
72  ZACHARY 995     +10
73  KIERAN  973     -12
73  LUCA    973     -1
75  ASHTON  954     +4
76  BAILEY  939     -6
77  JAKE    913     +10
78  GABRIEL 910     +14
79  SAM     900     -2
80  EVAN    890     0
81  BRADLEY 847     -13

次のように、たとえば「L」の文字が含まれる行のみを抽出するにはどうすればよいですか。

73  LUCA    973     -1
8
Rubem74

それは重複しているようですが、とにかく、それが理解されていれば、次のように行うことができます:

まず、リストをいくつかのnameslist.txtファイルに保存してから、次のようにします。

sed -rn '/^[^\s]+\s+[F]/p' list.txt > result.txtresult.txtファイルに次の出力を返す必要があります。

60 FREDDIE 1201 +4 61 FINLAY 1200 -2

5
Renan41
awk '$2 ~ /^L/' file

正規表現$2~を使用して2番目のフィールド^Lをテストし、一致する行を出力するようawkに指示します。

正規表現は、^で始まるフィールド(文字列)をLで照合します

19
bu5hman

@ bu5hmanの答えに基づく:awkを使用すると、文字をパラメーターとして簡単に渡すことができます。

awk -v letter="L" 'substr($2, 1, 1) == letter' file
# or with a constructed regex
awk -v letter="L" '$2 ~ "^" letter' file
7
glenn jackman

list.txtにそのリストがあるとすると、次のことができます。

 grep -h L list.txt > list_L.txt 

説明:grep L list.txtは、大文字のLを含むすべての行を提供します。オプション-hは、ファイル名の出力を抑制しますが、複数のファイルを検索する場合にのみ必要です(例grep -h L lis*.txt )。 > list_L.txtを追加すると、指定したファイルに行がリダイレクトされます。

Lが "Word"の先頭(この場合は名前)にのみ出現する必要がある場合は、上記のコマンドを少し調整する必要があります。

 grep -h '\<L' list.txt > list_L.txt 

\<を追加すると、「Word」の先頭と一致するため、\<Lは大文字のLで始まるWordを含む行を選択します。

2
Tsundoku

別のgrepの例:

grep -E "[0-9]+ +L" file

+は前の文字の1つ以上の出現に一致するため、この場合は、少なくとも1つの数字と少なくとも1つのスペースに一致し、その後に大文字のLが続きます。

+ Eを+をリテラル '+'ではなく特殊文字として解釈する必要があります

出力:

59  LOUIS   1202    +1
62  LEON    1137    +12
73  LUCA    973     -1
2
F. Pareto

可能な場合はRegExを避けてください。 AWKの例:

index($2, "L") == 1
1
user327359