フィンランド語 - チェコ語からチェコ語 - フィンランド語に事前変更

フィンランド語 - チェコ語からチェコ語 - フィンランド語に事前変更

このファイルがあります。http://sinivalkoiset.wz.cz/ostatni/finnish-czech.txt 最初の列を2番目の列に置き換えたいです。私はsedの推薦を使用しました

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

2番目の逆参照は有効ですが、最初の逆参照は無効です。私は逆参照の終わりに「スペース」を使用します。しかし、ある単語には2つの単語が含まれているので、そのように動作しないことに気づきました。

答え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}' 

削除すると、awkは2番目のフィールドを印刷してから1番目のフィールドを印刷しますtr。入力フィールド区切り文字をタブに\r設定し-F"\t"(1行に2単語以上が許可されていない限り、これを行う必要はありません)、-vOFS=:\t"出力区切り文字をタブに設定します。

答え4

パターングループ化を使用して列をキャプチャしてから置き換えることができます。

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

関連情報