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
sponge
stdin
入力が終わるまでメモリに保存し、ファイルに書き込みます。これは上記のサイズのファイルに許可されます。
代わりに、シェルリダイレクトを使用してファイルを入力することもできますtd
。cat
たとえば、次のようになります。
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()
にします。