当文件中的第三列不唯一时创建换行符

时间:2016-03-19 00:04:35

标签: bash

我有一个标签分隔文件,格式如下:

January Jay RESERVED    4
February    Jay RESERVED    5
March   Jay SUBMITTED   6
December    Jay USED    7

我想要做的是在第三列唯一的行之间创建空格或新行。

对于这个例子,我想要这个输出:

January Jay RESERVED    4
February    Jay RESERVED    5

March   Jay SUBMITTED   6

December    Jay USED    7

2 个答案:

答案 0 :(得分:1)

如果您的数据位于名为stuff的文件中:

lastVal="";cat stuff |while read i ; do thisVal=$(echo "$i" |cut -d$'\t' -f'3'); if [ "$lastVal" != "$thisVal" ]; then echo "" ;lastVal=$thisVal; fi ;echo "$i" ;done

这是您可以用作脚本的同一命令的版本。请参阅下面的用法。

#!/bin/bash
lastVal="";
while read i ; do
    thisVal=$(echo "$i" |cut -d$'\t' -f'3')
    if [ "$lastVal" != "$thisVal" ]; then
        echo ""
        lastVal=$thisVal
    fi
    echo "$i"
done


如果您将脚本命名为myScript.bash,则可以使用以下两种方法之一:

cat yourfile | /path/to/myScript.bash

/path/to/MyScript.bash < yourfile

请注意,如果要在Bash提示符处插入文字选项卡,可以输入ctrl + v然后单击选项卡。 Ctrl + v也允许您插入其他特殊字符。 Ctrl + v允许你输入像tab这样的特殊字符,所以要在cut -d'部分添加TAB作为分隔符,点击ctrl-v然后点击tab(在Linux中,而不是SO)。

答案 1 :(得分:0)

Awk可以非常轻松地做到这一点:

awk -F $'\t' '{print (v==$3 ? $0 : "\n"$0); v=$3}' foo.txt

awk旨在处理以空格分隔的数据列,因此第三列由$3表示。我们所做的只是检查值是否已更改,print是否有额外的行。

这不检查“唯一”值,而只检查上一行值的变化。据我所知,这与你接受的答案是一样的。