使用字符串作为分隔符从shell分割线

时间:2015-06-07 15:33:23

标签: shell awk sed cut

我有一个类似

的文件
N #>= 6

我想将此文件拆分为两个单独的文件,称为源和目标,这样源文件只包含' - >之前的元素。 '和目标文件,后面的部分。

我尝试使用如下剪切

60 -> 36
48 -> 11
60 -> 59
35 -> 29
27 -> 76

但是cut给了我这个错误

cut -d' -> ' -f1 input > source
cut -d' -> ' -f2 input > destination

6 个答案:

答案 0 :(得分:3)

awk '{print $1 > "source"; print $3 > "destination"}' input

答案 1 :(得分:1)

尝试使用空格作为分隔符:" "。在第二种情况下使用-f3

或者使用GNU sed:

sed -ne 'h;s/ .*//w source' -e 'g;s/.* //w destination' input

答案 2 :(得分:1)

awk是您进行正则表达式分割的最佳选择。

假设:

$ echo "$tgt"  
60 -> 36
48 -> 11
60 -> 59
35 -> 29
27 -> 76

您可以在正则表达式上使用awk拆分输入:

$ echo "$tgt" | awk -F " -> " '{print $1}'
60
48
60
35
27
$ echo "$tgt" | awk -F " -> " '{print $2}'
36
11
59
29
76

根据需要重定向到两个文件。

答案 3 :(得分:0)

这样的事情可能是(gnu sed)

sed 's/^\([^ ]*\)/\1/' <file >source  
sed 's/.* \(.*\)/\1/' <file >destination  

答案 4 :(得分:0)

据我了解,cut无法使用多个字符作为分隔符。

使用sed,它应该像这样工作:

sed -E 's/^(.*) -> .*$/\1/g' input > source
sed -E 's/^.* -> (.*)$/\1/g' input > destination

答案 5 :(得分:0)

sed '1!H;1h;$!d
g;s/ ->[ 0-9]*//g;w Source
g;s/[ 0-9]* ->//g;w Destination
' YourFile

通过删除所有行结束来写入源,而不是在将文件加载到内存中并将其用于每个子目录后移除行头的目标