xargs 和 cut:将 csv 的“cut”字段获取到 bash 变量

xargs and cut: getting `cut` fields of a csv to bash variable

我将 xargscut 结合使用,但我不确定如何将 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/dirfilename.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 f2test.txt一行一行读取一行, 以逗号分隔行,然后分配变量 f1f2 到田野。
  • echo ..用于演示目的。更换 使用 $f1$f2.
  • 符合您想要的命令