在脚本中使用 Cut 从特定字符串中剪切列

在脚本中使用 Cut 从特定字符串中剪切列

我有一个名为 viagens.txt 的文件:

2018-10-01:88020:88013:6:4.2
2018-10-01:88020:88014:8:3.8

我想创建一个脚本,在每一行中检查第二列(在本例中,在两种情况下都会返回“88020”)。

但是,现在我无法过滤它以获取第二列上的数字。我有这个代码:

#!/bin/bash
fich=viagens.txt
condutores=condutores.txt
if [ -f $fich ];then
    for f in $(cat $fich); do
        condutor=$(cut -f2 $f)
        echo $condutor
    done
else
    echo "Ficheiro nao existe"
fi

我也尝试过

#!/bin/bash
fich=viagens.txt
condutores=condutores.txt
if [ -f $fich ];then
    for f in $(cat $fich); do
        condutor=$(cat $f | cut -d' ' -f2)
        echo $condutor
    done
else
    echo "Ficheiro nao existe"
fi

我究竟做错了什么?

提前致谢。

答案1

在这两个脚本中,您使用的cut文件的名称是从viagens.txt文件中读取的。您应该No such file or directory从两个脚本中收到错误(请记住始终在问题中包含任何错误)。

反而:

#!/bin/bash

fich=viagens.txt

if [ ! -f "$fich" ]; then
    echo "Ficheiro nao existe" >&2
    exit 1
fi

cut -d : -f 2 <"$fich" |
while read data; do
    printf 'Data read: %s\n' "$data"
done

将从输入cut -d : -f 2返回第二个分隔字段。:cut

或者,如果您只想输出该列:

#!/bin/bash

fich=viagens.txt

if [ ! -f "$fich" ]; then
    echo "Ficheiro nao existe" >&2
    exit 1
fi

cut -d : -f 2 <"$fich"

答案2

怎么样 - 尽管事先检查文件是否存在 - 将文件的行读入数组,设置为IFS:并打印第二个元素?

IFS=:
while read -a TARR; do echo ${TARR[1]}; done < viagens.txt
88020
88020

不要忘记设置IFS回其原始值。

相关内容