如何删除此文件中不需要的部分?

Bob*_*urt 3 command-line bash text-processing

我有这个 .scp 文件,其中包含转换一堆文件所需的完整命令。

这个文件是由不同的脚本生成的,用于不同的目的,但现在我需要它转换一堆文件。

问题是每个文件都以被转换文件的文件名开头,当我想执行它时这不起作用..

如何删除文件的第一个,以便我可以转换所有文件,就像执行脚本一样简单?

下面是如何格式化文件中的文本的示例。

fcaw-b-an406 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an406-fcaw-b.sph |
fcaw-b-an407 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an407-fcaw-b.sph |
fcaw-b-an408 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an408-fcaw-b.sph |
fcaw-b-an409 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an409-fcaw-b.sph |
fcaw-b-an410 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an410-fcaw-b.sph |
fcaw-b-cen1 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/cen1-fcaw-b.sph |...
Run Code Online (Sandbox Code Playgroud)

期望输出

/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an406-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an407-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an408-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an409-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an410-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/cen1-fcaw-b.sph |...
Run Code Online (Sandbox Code Playgroud)

hee*_*ayl 5

很多方法:


  • grep使用 PCRE ( -P):

    grep -Po '^[^\s]+\s+\K.*' file.txt
    
    Run Code Online (Sandbox Code Playgroud)
    • ^[^\s]+\s+匹配第一个字段和尾随空格,\K丢弃匹配,然后.*匹配行的其余部分并打印


  • awk

    awk -F "[[:blank:]]+" '{$1=""; print substr($0, 2)}' file.txt
    
    Run Code Online (Sandbox Code Playgroud)
    • -F "[[:blank:]]+"将字段分隔符设置为一个或多个空格,$1=""将第一个字段设置为空字符串,这会在前面引入一个空格,因此我们需要使用 substr($0, 2)` 进行字符串切片以获取从第二个开始的字符


  • bash

    while read -r _ desired; do echo "$desired"; done <file.txt
    
    Run Code Online (Sandbox Code Playgroud)
    • 读取每一行并将第一个字段设置为赠品变量_desired包含剩余部分,并由echo "$desired"


  • python

    #!/usr/bin/env python
    with open('file.txt') as f:
        for line in f:
            print line.split(' ', 1)[1]
    
    Run Code Online (Sandbox Code Playgroud)
    • 读取每一行,line.split(' ', 1)并将split在空间上进行最大的1拆分操作,因此索引 0 将包含第一个单词,索引 1 将包含所需的部分(即从第二个单词到结尾)