HiveBrain v1.2.0
Get Started
← Back to all entries
patternbashMinor

Optimize bash script that concatenates output

Submitted by: @import:stackexchange-codereview··
0
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_FILE

Solution

-
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 $LOGFILE


does the same job.

Code Snippets

chdir "$FOLDER"
    for file in *.csv; do
        echo -n "$file" "|" | sed -r ...
        head -1 "$file"
    done | tee $LOGFILE

Context

StackExchange Code Review Q#75214, answer score: 9

Revisions (0)

No revisions yet.