如何将所有行的第 n 个单词写入新文件?例如,我想要在 new_file.txt 中写出所有行的第二个单词:
旧文件.txt:
pippo pluto paperino
gigi lui marco
piero andrea chiara
新文件.txt:
pluto
lui
andrea
答案1
第一步,删除每行除第二个单词之外的所有单词。这是一个相当简单的:%norm
命令:
:%norm dwwhD
dwwhD
这就像在每一行手动输入一样,但速度更快。第二步,保存到新文件:
:w new_file.txt
然后退出而不保存,以便old_file.txt
保持不变:
:q!
答案2
:!cut % '-d ' -f2 > new_file.txt
请注意,默认分隔符是cut
制表符,因此您需要使用“-d”将分隔符设置为空格。
在 Vi 内部,您可以用作%
当前文件名的替换。
答案3
您可以使用简单的 bash 脚本从终端命令行执行此操作。第一的循环遍历文件的内容。然后对于每一行,将 echo 通过管道传输到 awk 中并让 awk 提取第二列。最后将该文本重定向到一个新文件中。
将所有这些放在一起:
while read line; do
echo $line | awk '{print $2}' >> new_file.txt
done <old_file.txt
答案4
使用:s
带有正则表达式的命令:
:%s/\v^\s*\S+(\s+(\S+).*)?/\2
这\v
告诉 Vim 使用“非常神奇”的正则表达式风格,这类似于 grep 或 pcre 中的扩展正则表达式。
正则表达式匹配开头的单个单词,前面可能有一些可选的空格。然后,在一些空白之后,第二个单词被捕获到 group 内\2
。最后,a.*
匹配该行的整个其余部分。
第一个单词后面的部分是可选的(分组在括号中并与最后的 一起可选?
)。这确保了具有单个单词的行仍然会匹配,在这种情况下,它们将被替换为空行,我想这就是具有单个单词的行所期望的,因为第二个作品在该行中是空白的案件。这是使用正则表达式执行此任务的优点之一,因为您可以更好地控制如何处理具有极端情况的行。
最后\2
用group进行替换。它单独捕获了该行的第二个单词。
然后您可以将修改的内容保存为新文件名:
:saveas new_file.txt
这将保留您的未修改状态old_file.txt
,并确保对当前缓冲区的进一步修改只会转到new_file.txt
.