![提取逗号之间的数据](https://linux22.com/image/29664/%E6%8F%90%E5%8F%96%E9%80%97%E5%8F%B7%E4%B9%8B%E9%97%B4%E7%9A%84%E6%95%B0%E6%8D%AE.png)
我有一个输出文件,其中包含以逗号分隔的不同数字。问题是我不知道逗号的数量。
我反过来希望将此数据 grep 到另一个文件上。例如:
我有信息:10,20,30,55,58,47,52,100
我用
awk '{split($0,a,","); for (i=1; i<=8; i++) print a[i]}' TMPFILE
提取数据。但我不知道for
循环需要执行多长时间。
一旦我得到像 10 这样的数字,我需要grep
在 data.txt 上得到它,然后在 data.txt 上得到 20 等等,直到最后一个数字。
答案1
AKW:
echo '10,20,30,55,58,47,52,100' | \
awk '{x=split($0,a,","); for (i=1; i <= x; ++i) print a[i]}'
awk 使用字段分隔符:
echo '10,20,30,55,58,47,52,100' | \
awk -F ',' '{for(i=1; i <= NF; ++i) print $i}'
sed:
echo '10,20,30,55,58,47,52,100' | sed 's/,/\n/g'
那么,命令将是例如:
sed 's/,/\n/g' TMPFILE | xargs -I'{}' grep '{}' data.txt
或者,正如使用xargs
也许:
xargs -a TMPFILE -d, -I'\x' grep '\x\{1\}' data.txt
或者,如果您不想使用xargs
也许;使用 sed 制作模式文件:
sed 's/\([^,]\+\),*/^\1$\n/g' TMPFILE | \
grep -o -f /proc/self/fd/0 data.txt
或者,
tr ',' '\n' < TMPFILE | \
grep -f /proc/self/fd/0 data.txt
一切都取决于您想要 grep 的内容和方式。
答案2
如果想重复 grep 同一个文件,你也可以尝试 shell 循环:
IFS=,
for i in $(cat csvfile)
do
grep "$i" datafile
done > outfile
如果您不将其放入脚本或子 shell 中,则需要
oldIFS=$IFS
之前和
IFS=$oldIFS
然后..