コマンドラインからすべての行の最初と最後の文字を削除する


8

テキストファイルのすべての行の最初と最後の文字を削除して、切り捨てられたバージョンを新しいファイルに保存しようとしています。awk特に誰かが大きなファイルのために効率的に使用したり、他のLinuxプログラム/コマンドを実行したりする方法について誰かが知っていますか?

input.txt

(s,2,4,5,6)
"s,1,5,5,2"
{z,0,4,5,3}
[y,2,4,5,5]
(y,4,4,5,7)
(r,20,4,5,7)
(e,9,4,5,2)

予想されるoutput.txt

s,2,4,5,6
s,1,5,5,2
z,0,4,5,3
y,2,4,5,5
y,4,4,5,79
r,20,4,5,7
e,9,4,5,2

回答:


14

それだけで別の方法:

rev input | cut -c2- | rev | cut -c2-

(注:GNUのcut場合、(例のように)1バイトのみの文字に対してのみ機能します)。


いいね!これは、これまでに提案されたsedおよびawkソリューションよりも大幅に高速です。
Gilles「SO-邪悪なことをやめなさい」2013

私はsed / awk / regex構文を恐れている人にこの回答を提案しましたが、特に3つのパイプがあり、内容全体をそれぞれに渡す大きなファイルの場合、それが速くなるとは想像もしていませんでした。sedまたはawkが一度に1行ずつ読み取る方が、大きなファイルの場合により効率的だと考えたでしょう。
Drake Clarris 2013年

3
これらの* nixユーティリティの多くが40年以上に渡って最適化されていると思います。
Drake Clarris 2013年

@Gilles、それは入力のいくつかの形式のutf8ロケールでGNU sedより高速であり、それはあなたが壁時計時間とCPU時間のどちらを考慮しているかに依存します。ssedまたは家宝のツールチェストをsed使用すると、パフォーマンスが向上します。
ステファンChazelas

@Gilles Solaris 5.10にはrevのMANエントリはありません。結局使用しましたsed
ayrton_senna 2015年

10

あなたが質問するように、以下のように入力ファイルから最後と最初の単語を削除します:

sed 's/.$//; s/^.//' inputfile

これらを他のソリューションに対してベンチマークできれば、すばらしいでしょうs/.\(.*\).$/\1/。後方参照を使用しないため、より高速になる可能性があり、質問では「大きなファイル」について言及していました。
l0b0 2013年

4
@ l0b0でテストしましたtime yes | head -n 10000000 | COMMAND >/dev/null。I GET rev input | cut -c2- | rev | cut -c2-→0.14s、sed 's,.\(.*\).$,\1,'→3.38s。awk '{print substr($0,2,length()-2);}'→3.50s; sed 's/.$//; s/^.//'→5.09秒。
ジル 'SO-悪をやめる'

@ギレス+1それが答えになるはずです。
l0b0 2013年

2
@ギレス、それは非常に短い行です。30文字幅の行の場合、@ RahulPatilのソリューションは、GNU sedでは@juampaのソリューションよりも3倍高速です。また。(GNU sedが再度)sed 's/.\(.*\)./\1/'よりも高速であるように見えますsed 's/^.\(.*\).$/\1/'。また、パフォーマンスはロケール(文字の解釈)とsed実装(その点で、家宝ツールチェストからのsedはGNU sedよりもかなり高速です)に依存します。
ステファンChazelas

5

いつものように、多くの可能性があります

sed 's,.\(.*\).$,\1,g' your_file

説明

  • , -sed区切り文字は、必要に応じてエスケープされるので、他の任意の文字にすることもできます。
  • . 単一の文字に一致
  • \(.*\) -残りの部分をグループ化し、これはさらに検索するために保存されます。
  • . もう一度1文字に一致させる
  • $ -行末
  • \1 -上記のグループに一致するテキストを出力します
  • g ライン上でグローバルに交換します。

2
なんでg?1行に1つしか一致しません。
njsg 2013年

2文字未満の行からは何も削除されないことに注意してください。
ステファンChazelas

3

必要にawk応じてそれを行うこともできます

awk '{print substr($0,2,length()-2);}' input.txt > output.txt

2
tr -d '()[]{}"' < your_file

これも動作するはずです。これは、各文字を何にも「翻訳」するだけです(削除)。

欠点は、最初と最後の文字でもない場合は削除されることです。また、にリストしていない終了文字も見逃します()[...

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