【问题标题】:Extract number in every line of TSV file在 TSV 文件的每一行中提取数字
【发布时间】:2021-06-28 22:24:27
【问题描述】:

我有一个包含制表符分隔值和空格的文件,如下所示:

! (desambiguación)  http://es.dbpedia.org/resource/!_(desambiguación)   5
! (álbum)   http://es.dbpedia.org/resource/!_(álbum_de_Trippie_Redd)    2
!!  http://es.dbpedia.org/resource/!!   4
$9.99   http://es.dbpedia.org/resource/$9.99    6
Tomlinson   http://es.dbpedia.org/resource/(10108)_Tomlinson    20
102 Miriam  http://es.dbpedia.org/resource/(102)_Miriam 2
2003 QQ47   http://es.dbpedia.org/resource/(143649)_2003_QQ47   2

我想提取每一行的最后一个数字:

5
2
4
6
20
2
2

为此,我已经这样做了:

while read line;
        do
            NUMBER=$(echo $line | cut -f 3 -d ' ')
            echo $NUMBER
        done < $PAIRCOUNTS_FILE

主要问题是某些行的空格比其他行多,cut 不适用于我使用默认分隔符(制表符)。我不知道为什么,可能是因为我使用的是 WSL。

我尝试了cut 的几个选项,但无论如何都不起作用:

NUMBER=$(echo $line | cut -f 3 -d ' ')
NUMBER=$(echo $line | cut -f 4 -d ' ')
NUMBER=$(echo $line | cut -f 2)
NUMBER=$(echo $line | cut -f 3)

希望你能帮我解决这个问题。提前致谢。

【问题讨论】:

  • 您是否真的在cut 命令中将分隔符设置为制表符?从您的帖子来看,它看起来好像被设置为空格。

标签: bash windows-subsystem-for-linux


【解决方案1】:

我想提取每一行的最后一个数字:

你可以使用grep

grep -Eo '[[:digit:]]+$' file

mapfile aka readarray 这是一个 bash4+ 功能。

mapfile -t array < file
printf '%s\n' "${array[@]##* }"

【讨论】:

  • 我觉得grep版本最简单,最简单最好!
  • 很高兴我能帮上忙。
【解决方案2】:

你可以使用awk:

awk '{print $NF}' file

使用剪切(如果它是真正的 TAB 分隔并且每行 3 个字段):

cat file | cut -f3

如果每行有一些可变数量的字段,请使用rev|cut|rev 获取最后一个字段:

cat file | rev | cut -f1 | rev 

或者用纯 Bash 和参数扩展:

while IFS= read -r line; do
    last=${line##*  }    # that is a literal TAB in the parameter expansion 
    printf "%s\n" "$last"; 
done <file

或者,读入一个 bash 数组并回显最后一个字段:

while IFS=$'\t' read -r -a arr; do
    echo "${arr[${#arr[@]}-1]}"
done <file

如果您同时使用制表符和空格,您可以执行 通常 是错误的操作,并将一般空白(制表符和空格)上的 Bash 变量分解为数组:

while IFS= read -r line; do
    arr=($line)     # break on either tab or space without quotes
    echo "${arr[${#arr[@]}-1]}" 
done <file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 2018-08-26
    • 1970-01-01
    • 2016-01-24
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多