1つのドットのみを含む行をすべて削除します。

1つのドットのみを含む行をすべて削除します。

私は大きなテキストを持っています。 1行しかないすべての行を削除したいです.

入力例:

abc.google.org
yahoo.com
abc.yahoo.in
abcd.bing.com
abcd.xyz.bing.uk
abcd.xyz.mnp.bing.uk
stackexchange.com
yas.sxs.sxs.zs.sxstackexchange.com

予想出力:

abc.google.org
abc.yahoo.in
abcd.bing.com
abcd.xyz.bing.uk
abcd.xyz.mnp.bing.uk
yas.sxs.sxs.zs.sxstackexchange.com

あなたが提供できるどんな助けでも本当に感謝します。

答え1

awk -F'.' 'NF!=2' infile

2つのフィールドのみが含まれている場合(つまり、1点だけが見つかった行)、これらの行は印刷されません。オプションを使用してフィールド区切り-F文字を指定できます。


またはgsub()関数を使用してください:

awk 'gsub(/\./, ".")!=1' infile

ドット文字が複数回正常に変更された場合は、印刷します。

答え2

それはまるで

grep -v '^[^.]*\.[^.]*$' input.txt

これを行うすべての行を印刷します。いいえ1行で単一のピリオドを見つけるREと一致します。

答え3

@shawnのgrepと同じ正規表現を使用するsedソリューションは次のとおりです。

sed -i.bak '/^[^.]*\.[^.]*$/d' FILE

FILEを直接処理する(あいまいな)利点があります(ただし、元の内容でFILE.bakを作成します)。アンカーポイント^と$のため、正規表現は行全体を占めます。行がゼロ個以上の点ではない文字列[^.]*、その後の点、ゼロ個以上の点以外の文字列で構成されている場合は[^.]*削除されます。

サンプル入力でテストします。

答え4

POSIX sed:

  • 次に、複数の点を持つ行が印刷されます。
  • 残ったのは、点が一つあったりない直線だけです。その中のポイントを削除してください。
sed -e '/\..*\./b' -e '/\./d' file

GNU awk:

  • 点以外のすべてを削除し、結果の文字列の長さを記録し、1つと比較します。
awk 'length(gensub(/[^.]/,"","g",t=$0))-1' file

GNU sed:

  • 後で使用するために予約されたスペースにスレッドを保存します。
  • ポイントを削除してみてください。
  • 失敗した場合は、その行を印刷して読み続けます。
  • 残りのポイントがない場合=>元のポイントには1つのポイントしかありません。だから削除してください。
  • それ以外の場合、ポイントは1より大きいため、元の行を検索します。
 sed -e 'h;s/\.//;T;//!d;g' file

真珠:

  • ドット音訳の数が1つの場合は、リスト区切り文字($、)を指定し、デフォルトは空の文字列です。
  • -p オプションは現在のレコードを自動的に印刷します。
perl -pe 'y|.||-1||($_=$,)' file

Python:

  • if句と一緒にリストを理解するには、2つ以上のフィールドに分割するか、フィールドを持たない行を選択します。
python3 <<\eof
with open('file') as f:
  print(*[l for l in f if len(l.split('.')) != 2],sep='',end='')
eof

複数の -e 文が ORing を意味する標準 grep

$ grep -e '\..*\.' -e '^[^.]*$' file

関連情報