ファイルの前処理を行っています。次の形式のデータを含むテキストファイルが2つあります。
テキストファイル1
"Name","Age","Class"
"Total Students:","247"
"John","14","8"
"Sara","13","8"
テキストファイル2
"Name","Age","Class"
"Total Students:","119"
"John","15","9"
"Sara","16","9"
私が望むのは、このファイルと引用符から最初の2行を削除してから、次のコマンドを使用してファイルを出力ディレクトリに移動することです。
sed '1d' "$file" >> temp.txt
sed -i '1d' temp.txt
sed -i 's/"//g' temp.txt
mv temp.txt output/$file
私が直面している問題は、これらのコマンドが単一のファイルでのみ機能することです。ファイル名はclass_8.txtそしてclass_9.txt。両方のファイルに同じコマンドを適用する解決策はありますか?元のファイルは保持し、処理されたファイルを出力フォルダに移動したいと思います。
ベストアンサー1
sed
複数のファイルで便利に実行し、同時に複数のファイルに書き込むことはできません(入力と出力が別々のファイルである必要がある場合)。非標準の拡張子を使用するか、式に出力ファイル名をハードコードして使用できますsed
。
tail
操作は非常に簡単ですが、ループでandを使用したい場合があります。tr
for file in Class_{8,9}.txt; do
tail -n +3 "$file" | tr -d '"' >output/"$file"
done
または本当にsed
使用したい場合
for file in Class_{8,9}.txt; do
sed -e '1,2d' -e 's/"//g' "$file" >output/"$file"
done
ファイルを最初にコピーしてから、コピーに対してsed
一度に内部編集を実行することもできます。ある意味、これはループをGNUの内部タスクに委任しますsed
。
cp Class_{8,9}.txt output
sed -i -e '1,2d' -e 's/"//g' output/Class_{8,9}.txt
フィールドにカンマまたは改行が含まれている場合は、二重引用符を削除すると無効なCSV出力が生成されます。不要な二重引用符のみを削除するには、csvformat
次のCSVパーサーを使用してください。csvkit。
上記のコマンドはすべて、このoutput
ディレクトリがファイルを作成できる既存のディレクトリであると仮定しています。