0
cat test.txt
/one/two/thre.erf;/four/five;4;4
/six/seven/eight.erf;/nine/ten/AABD_CASH_EDBC_FLOW;4;4

期望的输出:

four
nine/ten

这样做:在一行中获取输出 - 问题。

cat test.txt| cut -d ';' -f2 | awk -F'/' '{for (i=1; i<NF; i++) printf("%s/", $i)}'
/four//nine/ten/

有更好的方法吗?

4

6 回答 6

3

您可以一次性获得所需的输出:

awk -F';' '{d=$2;f=$2
        sub(/\/[^/]*$/,"",d)
        sub(/.*\//,"",f)
        a[NR]=d;b[NR]=f}

        END{for(;++i<=NR;)print a[i]
            print ""
            for(;++j<=NR;)print b[j]}' file

将输出:

/four
/nine/ten

five
AABD_CASH_EDBC_FLOW

编辑

没有注意到OP改变了问题。这一变化使我的上述答案毫无意义,但它使问题变得容易多了。可以做到

awk

kent$  awk -F';/' 'sub(/\/[^/]*$/,"",$2)&& $0=$2' file 
four
nine/ten

或仅使用grep

kent$  grep -Po '^.*?;/\K.*(?=/[^/]*$)' file
four
nine/ten
于 2013-06-05T21:21:35.380 回答
2

的一种选择。

内容script.vim

set backup
g/^/normal df;x$dF/x
normal ZZ

像这样运行它:

vim -S script.vim test.txt

这会就地修改文件,从而产生:

four
nine/ten

并且还创建一个附加~后缀的备份文件,可以避免第一次尝试游戏结束。

于 2013-06-05T22:00:16.477 回答
1

GNU sed

sed 's:^.*;/\(\w*/\w*\).*:\1:;1~2s:/.*::' file

..输出是:

four
nine/ten
于 2013-06-05T22:15:10.643 回答
1

这可能对您有用(GNU sed):

sed -r 's|[^;]*;/([^;/]*(/[^;/]*)*)/.*|\1|' file

这假定第二个字段中至少有 2/个。

于 2013-06-06T09:16:34.293 回答
0
 grep -Po '(?<=;)/[^;]*(?=/)' test.txt
于 2013-06-06T06:00:34.053 回答
0
while IFS=';' read -ra fields; do 
    d=$(dirname "${fields[1]}")
    echo "${d#/}"
done < test.txt
于 2013-06-30T01:57:41.703 回答