我的文件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