Issue
I have a for loop that accepts a file with one type of extension, but the final command in the pipe requires the STDIN file to have an extension of another type. In my pipe I use awk
to change the file type so that it is properly formatted for the final command, but the extension is still linked to the initial input file.
For example:
for file in *.AAA
do
commandA $file | awk ' { print } ' | commandB
A typical use of commandB:
commandB -i myfile.BBB
Is there a way for me to change the extension of a file in the middle of a for loop & pipe?
Solution
I think you can change the extension of a file in the middle of a for loop and pipe, As you see ${file%.*}
is a cool trick that basically removes the file extension (*.AAA
) from the original file name, and then, I add the .BBB
extension to create the new file name, which I call new_file
,and to top it off,I pass this modified file to commandB
with the -i
option!
for file in *.AAA
do
new_file="${file%.*}.BBB" #change the extension to .BBB
commandA "$file" | awk '{ print }' | commandB -i "$new_file"
or you can use process substitution, so I use sed
to change the file extension from .AAA
to .BBB
in the file name,and then, I pass this fancy modified file name to commandB
using something called process substitution, which treats the command's output like a temporary file :
for file in *.AAA; do
commandA "$file" | awk '{ print }' | commandB -i <(commandA "$file" | awk '{ print }' | sed 's/\.AAA$/.BBB/')
done
Answered By - Freeman Answer Checked By - Dawn Plyler (WPSolving Volunteer)