1つのパスに約300個のCSVファイルがあります。これらのファイル名には*_PROD.csv
、*_DEV.csv
3つのカテゴリがあります*_UAT.csv
。
これらのファイルには多くの空行(約1000行)があり、プロセスがファイルをパスにコピーするとレコードの末尾に挿入されます。
これらすべてのファイルから空白行を削除したいと思います。スペースを削除した後、このファイルをマージする必要があります。
私はこれを試しました:
sed -i '/^$/d' ${File_Path}*_PROD.csv
sed -i '/^$/d' ${File_Path}*_DEV.csv
sed -i '/^$/d' ${File_Path}*_UAT.csv
しかし、これは期待どおりに機能しませんでした。
最後に空白行を削除した後は、他の操作を実行する必要があるため、ファイルを変更せずに維持したいと思います。
提案してください。
参考のための私のスクリプト:
File_Path=/File_Path
dos2unix ${File_Path}*_PROD.csv
dos2unix ${File_Path}*_DEV.csv
dos2unix ${File_Path}*_UAT.csv
sed -i '/^\s*$/d' ${File_Path}*_PROD.csv
sed -i '/^\s*$/d' ${File_Path}*_DEV.csv
sed -i '/^\s*$/d' ${File_Path}*_UAT.csv
awk '(NR == 1) || (FNR > 1)' ${File_Path}*PROD.csv > Merged_PROD.csv
awk '(NR == 1) || (FNR > 1)' ${File_Path}*_DEV.csv > Merged_DEV.csv
awk '(NR == 1) || (FNR > 1)' ${File_Path}*_UAT.csv > Merged_UAT.csv
答え1
CSVファイルにはWindows行末があります。したがって、まずLinux形式に変換する必要があります。
dos2unix yourfile
あなたのためにそれを行います。
ボックスにない場合は、次dos2unix
のように同じ結果が得られます。
sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 or higher
tr -d \r <infile >outfile # GNU tr version 1.22 or higher
~によるとsed1line.txt。
ファイルがUnix形式に変換されると、通常のsed
コマンドは期待どおりに機能します。
空白行のスペースを確認してください。sed '/^\s*$/d' yourfile
1つのsedコマンドですべて:
sed -e 's/\r// -e /^\s*$/d' yourfile > outputfile
答え2
「空白」行には空白文字が含まれる可能性が高くなります(キャリッジリターンは、DOSまたはWindowsプログラムで作成されたファイルに注意する必要がある疑わしいことです)。次の点を考慮するようにモデルを変更できます。
sed -i -e '/^[[:space:]]*$/d' \
"${File_Path}"*_{PROD,DEV,UAT}.csv
(変数拡張も引用するように注意してください!)
答え3
最初にマージしてから空白行を削除すると、少し効率的です。次のことができます。
cat *_PROD.csv > MERGED_PROD.csv
dos2unix MERGED_PROD.csv
perl -i.bak -ne 'print if /\S/' MERGED_PROD.csv
最後のPerl行は、元のMERGED_PROD.csv
コピーをMERGED_PROD.csv.bak
。-i.bak
-i