将字典从芬兰语-捷克语更改为捷克语芬兰语

将字典从芬兰语-捷克语更改为捷克语芬兰语

我有这个文件http://sinivalkoiset.wz.cz/ostatni/finnish-czech.txt 我想将第一列与第二列交换。我使用了 sed 推荐

sed -ne 's/\([^a-z A-Z].*\) \(.*\)$/\2 \1/ p' finnish-czech.txt

第二个反向引用有效,但第一个反向引用无效。我使用“空格”作为反向引用的结尾。但后来我意识到它不会那样工作,因为有些单词包含两个单词。

答案1

我可以建议吗awk

awk 'BEGIN {OFS=FS="\t"} {sub(/\r/, ""); print $2,$1}' finnish-czech.txt

这也将消除文件中的 Windows 回车符。

答案2

不同语言中的单词是用制表符分隔的,而不是空格。 Sed 不处理制表符,但您可以$'\t'在 bash 中使用:

sed -e 's/\(.*\)'$'\t''\(.*\)/\2'$'\t''\1/' finnish-czech.txt

dos2unix不过,在此之前,请通过运行或从文件中删除 Windows 行结尾fromdos

答案3

请注意,您的文件具有 Windows 样式的行结尾。这可能会让事情变得混乱。此外,它的开头还有一些额外的字符:

$ wget -O - http://sinivalkoiset.wz.cz/ostatni/finnish-czech.txt 2>/dev/null | head -n1 | od -c
0000000 357 273 277   A   f   r   i   k   k   a  \t   A   f   r   i   k
0000020   a  \r  \n
0000023

无论如何,如果您不太依赖sed,那么这种事情很容易使用awk

tr -d $'\r'  < finnish-czech.txt | awk -F"\t" -vOFS="\t" '{print $2,$1}' 

删除后tr\rawk 将打印第二个字段,然后打印第一个字段。将-F"\t"输入字段分隔符设置为制表符(除非每行可以有超过 2 个单词,否则不需要这样做)并将-vOFS=:\t"输出分隔符设置为制表符。

答案4

您可以使用模式分组来捕获列,然后替换它们:

sed 's/^\([^[:blank:]]\+\)\([[:blank:]]\+\)\([^[:blank:]]\+\).*/\3\2\1/' file.txt

相关内容