brucezepplin
brucezepplin

Reputation: 9782

concatenate the result of echo and a command output

I have the following code:

names=$(ls *$1*.txt) 
head -q -n 1 $names | cut -d "_" -f 2

where the first line finds and stores all names matching the command line input into a variable called names, and the second grabs the first line in each file (element of the variable names) and outputs the second part of the line based on the "_" delim.

This is all good, however I would like to prepend the filename (stored as lines in the variable names) to the output of cut. I have tried:

names=$(ls *$1*.txt) 
head -q -n 1 $names | echo -n "$names" cut -d "_" -f 2

however this only prints out the filenames

I have tried

names=$(ls *$1*.txt 
head -q -n 1 $names | echo -n "$names"; cut -d "_" -f 2

and again I only print out the filenames.

The desired output is:

$
filename1.txt <second character>

where there is a single whitespace between the filename and the result of cut.

Thank you.

Upvotes: 1

Views: 1266

Answers (3)

SebasSBM
SebasSBM

Reputation: 908

If I didn't misunderstand your goal, this also works.

I've always done it this way, I just found out that this is a deprecated way to do it.

#!/bin/bash

names=$(ls *"$1"*.txt)
for e in $names;
    do echo $e `echo "$e" | cut -c2-2`;
done

Upvotes: 0

prodev_paris
prodev_paris

Reputation: 515

Maybe something like that will satisfy your need BUT THIS IS BAD CODING (see comments):

#!/bin/bash

names=$(ls *$1*.txt)    
for f in $names
do
  pattern=`head -q -n 1 $f | cut -d "_" -f 2`
  echo "$f $pattern"
done

Upvotes: 0

Tom Fenech
Tom Fenech

Reputation: 74685

Best approach, using awk

You can do this all in one invocation of awk:

awk -F_ 'NR==1{print FILENAME, $2; exit}' *"$1"*.txt

On the first line of the first file, this prints the filename and the value of the second column, then exits.


Pure bash solution

I would always recommend against parsing ls - instead I would use a loop:

You can avoid the use of awk to read the first line of the file by using bash built-in functionality:

for i in *"$1"*.txt; do
    IFS=_ read -ra arr <"$i"
    echo "$i ${arr[1]}"
    break
done

Here we read the first line of the file into an array, splitting it into pieces on the _.

Upvotes: 3

Related Questions