テキスト処理中のファイルの過度の使用を減らします。

テキスト処理中のファイルの過度の使用を減らします。

Results.txt現在、27,000行のファイル()があります。ファイルの内容は次のとおりです。

45008657        |       A.      |               |       Long    |       0
49210987        |       A.      |               |       Steven  |       3262
49600694        |       A.      |               |       Steven    |       4772
467814  |       A.      |       Rafeal    |       Nadal|       4133
53111047        |       A.      |       Mike    |       Tyson  |       13484

以下のように余分なスペースを削除する必要があります。

cat Results.txt | tr -d " \t\r" > Results1.txt

ファイル(Results1.txt)は余分なスペースなしできちんとフォーマットされています。

45008657|A.||Long|0
49210987|A.||Steven|3262
49600694|A.||Steven|4772
467814|A.|Rafeal|Nadal|4133
53111047|A.|Mike|Tyson|13484

すべての文字を小文字に変換し、2列を4列に追加する必要があります。

awk 'BEGIN { FS = "|" } ; { print $1"|"tolower($2) tolower($3) tolower($4)"|"$5 }' Results1.txt > Results2.txt

私のResults2.txtファイルは以下のとおりです。

45008657|a.long|0
49210987|a.steven|3262
49600694|a.steven|4772
467814|a.rafealnadal|4133
53111047|a.miketyson|13484

Results.txt初期ファイル自体内で上記のすべての手順を実行する方法はありますか?後でデバッグしやすいようにファイルの乱用を減らしたいと思います。

編集する:新しいファイルを作成した後、ファイルを一度だけ削除したくないだけです。これは私にとって優雅な解決策ではないようです。

答え1

GNUの使用sed:

sed -i 's/\s//g;s/\(|[^|]*\)|\([^|]*\)|/\1\2/;s/.*/\L&/' Results.txt

答え2

実際、一時ファイルは必要ありません。

awk -F'|' '{gsub("[ \t\r]", "", $0)}{print $1,tolower($2$3$4),$5}' OFS='|' inputfile

式の最初の部分は、ユーザーが実行するアクションを実行しますtr。 2番目の部分はフィールド2-4を結合し、それを小文字にし、他の2つのフィールドと一緒に印刷します。

あなたの入力に対して以下が生成されます。

45008657|a.long|0
49210987|a.steven|3262
49600694|a.steven|4772
467814|a.rafealnadal|4133
53111047|a.miketyson|13484

GNU awk 4.1.0以降は内部編集をサポートしています。あなたは言うことができます:

awk -i inplace -F'|' '{gsub("[ \t\r]", "", $0)}{print $1,tolower($2$3$4),$5}' OFS='|' inputfile

答え3

初期試行に応じて、このユーティリティを使用すると、すべてのコマンドを同じパイプに入れることができますsponge

cat Results.txt |
  tr -d " \t\r" |
  awk 'BEGIN { FS = "|" } ;
    { print $1"|"tolower($2) tolower($3) tolower($4)"|"$5 }' |
    sponge Results.txt

spongestdin入力が終わるまでメモリに保存し、ファイルに書き込みます。これは上記のサイズのファイルに許可されます。

代わりに、シェルリダイレクトを使用してファイルを入力することもできますtdcatたとえば、次のようになります。

tr -d " \t\r" <Results.txt

答え4

内部編集可能なツールを使用してください。 Perlを例に挙げてみましょう。

perl -i -F'\|' -lane 's/[ \t]+//g for @F; print lc("$F[0]|$F[1]$F[2]$F[3]|$F[4]")' a
  • 公開された-i内部編集と変更は元のファイルに直接適用されます(つまり、perl一時ファイルの作成と削除が処理されます)。

  • -a指定された文字の自動分割がオンになり、フィールドが配列-Fに保存されます@F

  • スペースとタブの両方を削除し、すべてs/[ \t]+//g小文字lc()にします。

関連情報