Reputation: 1073
Not sure why the last line does not cut the " from the script:
#!/bin/bash
FILENAME=$1
while read line
do
cut -d '"' -f2
echo $line
done < $FILENAME
$ cat file
"1" test
"2" test
"3" test
"4" test
"5" test
If I run this script with the following command:
$ ./test file
2
3
4
5
"1" test
Upvotes: 3
Views: 32446
Reputation: 342363
like dennis mentioned, there's no need to use external commands
$ while read -r line; do set -- $line; echo ${1//\"/}; done<file
1
2
3
4
5
But external commands runs faster if you have very large files.
$ cut -d'"' -f2 file
1
2
3
4
5
$ awk -F'"' '{print $2}' file
1
2
3
4
5
$ sed 's/^"//;s/".*//' file
1
2
3
4
5
Upvotes: 0
Reputation: 360085
Bash can do all the work for you. There's no need for cut
:
#!/bin/bash
FILENAME=$1
while read -r -a line
do
echo ${line//\"}
done < "$FILENAME"
That reads the line into an array, then treats the array as a scalar which gives you the first element. Then the brace expansion in the echo
strips out the quotation marks.
Or you can let cut
do all the work and give Bash a long coffee break:
FILENAME=$1
cut -d '"' -f2 "$FILENAME"
Always quote variables that contain filenames.
Upvotes: 2
Reputation: 753705
The loop executes once.
"1" test
into variable $line
.cut -d '"' -f2
which reads lines 2-5 of the file (because that is the standard input at the time) and prints the number.Fix:
cut -d '"' -f2 $FILENAME
If, on the other hand, you want to get the numbers into a variable, you could do this in a variety of ways, including:
cut -d '"' -f2 $FILENAME |
while read number
do # What you want
echo $number
done
or:
while read line
do
number=$(echo "$line" | cut -d '"' -f2)
echo $number
done
Upvotes: 7
Reputation: 31296
Jonathan Leffler's given you a simpler method (which will also be more efficient), but in case this is a simplification for something you're going to expand on (where just calling cut won't do what you want), and just to demonstrate the principle anyway, your code would need to be fixed up to feed each line to stdin explicitly as follows:
#!/bin/bash
FILENAME=$1
while read line
do
echo $line | cut -d '"' -f2
done < $FILENAME
Upvotes: 0