テキストファイルがあり、各行は次のように保存されます。
"Video or movie" "parent" "Media or entertainment" "1" "1" "1" "0" "0"
3列目を2列目に変更したいです。
"Video or movie" "Media or entertainment" "parent" "1" "1" "1" "0" "0"
シェルスクリプトや他のスクリプト言語を使用してLinuxでこれを行うには?最も簡単で迅速な方法が必要です。
答え1
これはフィールド区切り文字をawk
使用して行うことができます"
。しかし、これを行うときは空で$1
、$2
最初の文字列を保持し、$3
文字列の間にスペースがあり、$4
2番目の文字列などであることを覚えておく必要があります。また、すべてのフィールドを印刷して十分な値を入力するのではなく、2つの文字列を置き換える方が安定しています$n
。これを念頭に置いて、次の作業が必要です。
awk 'BEGIN{OFS=FS="\""} {tmp=$4;$4=$6;$6=tmp;print}' input_file >output_file
答え2
迅速で汚いsed
方法は次のとおりです。
sed -e 's/^\("[^"]*"\) *\("[^"]*"\) *\("[^"]*"\)/\1 \3 \2/'
ただし、値などに二重引用符があるフィールドでは失敗します。
一例:
echo \"a\" \"b\" \"c d d d\" \"e\" | sed -e 's/^\("[^"]*"\) *\("[^"]*"\) *\("[^"]*"\)/\1 \3 \2/'
しかし、誰かがあなたにもっと簡単でより良い冗談を見せることができると確信していますawk
。
答え3
私は以下を選択します:
sed 's/"\(.*\)"/\1/' |
awk 'BEGIN{FS="\" +\"";OFS="\" \""}{t=$3;$3=$2;$2=t;print}' |
sed 's/.*/"&"/'
どちらのsed
スクリプトも先行と末尾の二重引用符を処理します(区切り文字ではなく邪魔にならないため)。このBEGIN
句はフィールド分離を処理します。これはt=$3;$3=$2;$2=t
、フィールドを交換してからフィールド全体を印刷する標準イディオムです(OFSをフィールド区切り文字として使用)。
答え4
次のようなものはどうですか?
awk '{print $1, $3, $2, $4, $5, $6, $7, $8}' file > newfile