在 Unix Shell 脚本中的 Cut 中使用制表符分隔符

在 Unix Shell 脚本中的 Cut 中使用制表符分隔符

我的文件input.txt包含以下制表符分隔格式的数据-

23776112        Inactive        Active
23415312        Inactive        Active

根据要求,在 while 循环内,我想使用剪切第一列的数据并打印它 -

下面是代码的一部分——

......
......
    while read line
    do  
        SN=`echo ${line}|cut -d '       ' -f1`
        echo $SN
    done < input.txt
....
....

要使用上面的制表符作为分隔符,我使用Ctrl V Tab

但输出并不如预期。我得到 O/P-

23776112 Inactive Active
23415312 Inactive Active

而我想要 O/P 像 -

23776112 
23415312

答案1

cut -f 1 input.txt

这将为您提供制表符分隔文件中的第一列input.txt。默认的字段分隔符cut是制表符,因此无需进一步指定。

如果分隔符是实际上一个空间,使用

cut -d ' ' -f 1 input.txt

如果事实证明有多种的制表符和/或空格,使用awk

awk '{ print $1 }' input.txt

cut无论您是否使用或awk,此操作都不需要 shell 循环。

也可以看看 ”为什么使用 shell 循环处理文本被认为是不好的做法?”。


您的脚本不起作用的原因是,当您使用echo未加引号的变量时,选项卡会消失。

有关的:

答案2

Tab是 的默认分隔符cut,您不需要为其提供显式参数。

但是,您需要引用变量以防止制表符变成空格。

SN=`echo "${line}"|cut -f1`

但您也可以cut从一开始就避免使用。只需设置IFS\t.

IFS=$'\t'
while read -r SN rest
do 
    echo "$SN"
done < input.txt

答案3

bash 解释

$'\t'

作为制表符,所以

cut -d $'\t' -f 1

cut是告诉使用制表符作为分隔符的方法(但是,这是多余的,因为它是默认的)。但是,我更喜欢具有相同语法的 awk:

awk -v FS=$'\t' '{ print $1 }' < input.txt

相关内容