
私は大きなテキストを持っています。 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