我有这个 .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 将包含所需的部分(即从第二个单词到末尾)
- 读取每一行,并将