我该如何删除这个文件中不需要的部分?

我该如何删除这个文件中不需要的部分?

我有这个 .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 |...

期望输出

/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 |...

答案1

很多方法:


  • grep使用 PCRE( -P):

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

  • sed

    sed -E 's/^[^[:blank:]]+[[:blank:]]+//' file.txt
    
    • ^[^[:blank:]]+[[:blank:]]+匹配第一个字段,同样带有尾随空格,并替换为空字符串

  • awk

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

  • cut

    cut -d" " -f2- file.txt
    
    • -d" "将分隔符设置为空格,并-f2-从第二个开始打印字段

  • bash

    while read -r _ desired; do echo "$desired"; done <file.txt
    
    • 读取每一行并将第一个字段设置为赠品变量_desired包含剩余部分,然后打印出来echo "$desired"

  • perl

    perl -pe 's/^[^\s]+\s+//' file.txt
    
    • 类似的sed逻辑

  • python

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

相关内容