xargs 和 cut:将 csv 的“cut”字段获取到 bash 变量
xargs and cut: getting `cut` fields of a csv to bash variable
我将 xargs
与 cut
结合使用,但我不确定如何将 cut
的输出获取到一个变量,我可以通过管道将其用于进一步处理。
所以,我有一个这样的文本文件:
test.txt
:
/some/path/to/dir,filename.jpg
/some/path/to/dir2,filename2.jpg
...
我这样做:
cat test.txt | xargs -L1 | cut -d, -f 1,2
/some/path/to/dir,filename.jpg
但我想做的是:
cat test.txt | xargs -L1 | cut -d, -f 1,2 | echo
其中 $1 和 $2 是 /some/path/to/dir
和 filename.jpg
我很困惑,我似乎无法做到这一点..
试试这个:
cat test.txt | awk -F, '{print , }'
来自 man xargs
:
xargs [-L number] [utility [argument ...]]
-L number
Call utility for every number non-empty lines read.
来自 man awk
:
Awk scans each input file for lines that match any of a set of patterns specified literally in prog or in one or more files specified as -f progfile.
所以你不必使用 xargs -L1
因为你不通过 utility
来调用。
也来自man awk
:
The -F fs option defines the input field separator to be the regular expression fs.
所以awk -F,
可以代替cut -d,
部分。
The fields are denoted , , ..., while [=28=] refers to the entire line.
因此 </code> 用于第一列,<code>
用于第二列。
An action is a sequence of statements. A statement can be one of the following:
print [ expression-list ] [ > expression ]
An empty expression-list stands for [=29=].
The print
statement prints its argument on the standard output (or on a file if > file
or >> file
is present or on a pipe if | cmd
is present), separated by the current output field separator, and terminated by the output record separator.
把所有这些放在一起,cat test.txt | awk -F, '{print , }'
就能实现你想要的。
你可能想这样说:
#!/bin/bash
while IFS=, read -r f1 f2; do
echo ./mypgm -i "$f1" -o "$f2"
done < test.txt
IFS=, read -r f1 f2
从test.txt
一行一行读取一行,
以逗号分隔行,然后分配变量 f1
和 f2
到田野。
- 行
echo ..
用于演示目的。更换
使用 $f1
和 $f2
. 符合您想要的命令
我将 xargs
与 cut
结合使用,但我不确定如何将 cut
的输出获取到一个变量,我可以通过管道将其用于进一步处理。
所以,我有一个这样的文本文件:
test.txt
:
/some/path/to/dir,filename.jpg
/some/path/to/dir2,filename2.jpg
...
我这样做:
cat test.txt | xargs -L1 | cut -d, -f 1,2
/some/path/to/dir,filename.jpg
但我想做的是:
cat test.txt | xargs -L1 | cut -d, -f 1,2 | echo
其中 $1 和 $2 是 /some/path/to/dir
和 filename.jpg
我很困惑,我似乎无法做到这一点..
试试这个:
cat test.txt | awk -F, '{print , }'
来自 man xargs
:
xargs [-L number] [utility [argument ...]]
-L number Call utility for every number non-empty lines read.
来自 man awk
:
Awk scans each input file for lines that match any of a set of patterns specified literally in prog or in one or more files specified as -f progfile.
所以你不必使用 xargs -L1
因为你不通过 utility
来调用。
也来自man awk
:
The -F fs option defines the input field separator to be the regular expression fs.
所以awk -F,
可以代替cut -d,
部分。
The fields are denoted , , ..., while [=28=] refers to the entire line.
因此 </code> 用于第一列,<code>
用于第二列。
An action is a sequence of statements. A statement can be one of the following:
print [ expression-list ] [ > expression ]
An empty expression-list stands for [=29=].
The
> file
or>> file
is present or on a pipe if| cmd
is present), separated by the current output field separator, and terminated by the output record separator.
把所有这些放在一起,cat test.txt | awk -F, '{print , }'
就能实现你想要的。
你可能想这样说:
#!/bin/bash
while IFS=, read -r f1 f2; do
echo ./mypgm -i "$f1" -o "$f2"
done < test.txt
IFS=, read -r f1 f2
从test.txt
一行一行读取一行, 以逗号分隔行,然后分配变量f1
和f2
到田野。- 行
echo ..
用于演示目的。更换 使用$f1
和$f2
. 符合您想要的命令