在冒号分隔的文本文件中提取第一个单词

时间:2015-12-15 19:57:34

标签: bash

如何遍历文件并仅打印第一个单词。该行以冒号分隔。例 根:01:02:toor的

该文件包含多行。这就是我到目前为止所做的,但它确实无效。

  FILE=$1 
 k=1
   while read line; do
       echo $1 | awk -F ':' 
 ((k++))
 done < $FILE

我对bash-scripting一点都不好。所以对你们中的一个人来说这可能是非常微不足道的。

编辑:变量k是对行进行计数。

4 个答案:

答案 0 :(得分:4)

使用-d

-f
  • count=$( wc -l < filename ) 指定分隔符
  • -l指定要保留的字段

如果你需要计算线数,只需

wc
  • CNT_FILE=20 CNT_EXTTABLE=20 echo "_${CNT_FILE}_" echo "_${CNT_EXTTABLE}_" if [ "$CNT_FILE" == "$CNT_EXTTABLE" ]; then echo "match" else echo "no match" fi 告诉_20_ _20_ match 计算行数

答案 1 :(得分:3)

awk -F: '{print $1}' FILENAME

用冒号分隔时会打印第一个单词。这是你在找什么?

要使用循环,您可以执行以下操作:

$ cat test.txt
root:hello:1
user:bye:2

test.sh

#!/bin/bash

while IFS=':' read -r line || [[ -n $line ]]; do
    echo $line | awk -F: '{print $1}'
done < test.txt

在bash中逐行阅读的示例:Read a file line by line assigning the value to a variable

结果:

$ ./test.sh
root
user

答案 2 :(得分:1)

使用perl的解决方案

%> perl -F: -ane 'print "$F[0]\n";'  [file(s)]

如果您不想打印新行,请将“\ n”更改为“”。

答案 3 :(得分:1)

你可以在bash中获得没有任何外部命令的第一个单词,如下所示:

printf '%s' "${line%%:*}"

将访问名为line的变量并删除与glob :*匹配的所有内容并贪婪地执行此操作,以便靠近前面(即%%而不是单{{ {1}})。

虽然使用此解决方案,您需要自己完成循环。如果这是你想要对变量做的唯一事情,那么%解决方案会更好,所以你不必自己进行文件迭代。