patternbashMinor
Optimize bash script that concatenates output
Viewed 0 times
scriptconcatenatesoutputthatoptimizebash
Problem
I am trying to optimize my script that loops through a folder and extracts only the part of a file name before a date and the header of the file and outputs it into a different file using a delimiter. I feel the script is robust and I want to refactor it. If there is also a better way, please tell me.
#!/bin/bash
# script variables
FOLDER=path/to/folder
LOG_FILE=path/to/logfile.csv
# Getting the pattern and header of files from FOLDER
for file in `ls $FOLDER/*.csv`
do
echo -n $(basename "$file") 2>&1 | sed -r 's/(.*)_[0-9]{8}_[0-9][0-9]-[0-9][0-9].[0-9][0-9].csv/\1/' | tee -a $LOG_FILE
echo -n "|" | tee -a $LOG_FILE
cat $file | head -1 | tee -a $LOG_FILE
done #> $LOG_FILESolution
-
-
Two subsequent invocations of
-
-
A
-
Summing up,
does the same job.
do ... done is a compound command; every subcommand shares the file descriptors; so teeing the the loop has the same effect as teeing each subcommand.-
Two subsequent invocations of
echo can be combined together.-
cat $file is a dreaded UUOC.-
A
basename invocation can be avoided by changing directory to $FOLDER.-
ls is absolutely unnecessary. The shell already globbed the *.csv.Summing up,
chdir "$FOLDER"
for file in *.csv; do
echo -n "$file" "|" | sed -r ...
head -1 "$file"
done | tee $LOGFILEdoes the same job.
Code Snippets
chdir "$FOLDER"
for file in *.csv; do
echo -n "$file" "|" | sed -r ...
head -1 "$file"
done | tee $LOGFILEContext
StackExchange Code Review Q#75214, answer score: 9
Revisions (0)
No revisions yet.