行の 4 番目の単語を取得して行の先頭にコピーする必要があります (sed awk)

行の 4 番目の単語を取得して行の先頭にコピーする必要があります (sed awk)

500 万行のファイルがあります:

xx ss ss "abcde"

"abcde"これを各行の先頭にコピーする必要があります:

"abcde" xx ss ss "abcde"

文字列は"abcde"各行ごとに変化するため、特定の単語ではなく、常に各行の 4 番目の単語になります。

答え1

代替の awk :

awk '{print $4,$0}' file

テスト:

$ cat file7
abc def ghi nop
klm one two three
four five six nine

$ awk '{print $4,$0}' file7
nop abc def ghi nop
three klm one two three
nine four five six nine

答え2

ではsed、列が複数のスペースで区切られており、追加の列が存在する可能性があると仮定します。

sed 's/\([^ ]* *\)\{3\}\([^ ]*\)/\2 &/'

このパターンは、スペース以外の文字の後にスペースが続き、その後に\2置換文字列で参照される別の列が続く、3 つの繰り返し列と一致します。 は&、一致全体を置換に含めるため、4 番目の列は行の残りの部分全体の前に挿入されます。

これは 4 列以上でも機能しますが、4 列目がない場合には失敗することに注意してください。

拡張正規表現が利用可能な場合も同様です (FreeBSD または GNU sed)。

sed -E 's/([^ ]* *){3}([^ ]*)/\2 &/'

答え3

ここにはもっと良い答えがありますが、こちらも機能する for in ループがあります:

IFS=$'\n'; for i in $(cat file); do var=$(echo $i | awk '{print $4}')  ; sed -i "s/.*$var/$var &/g" file ;done

答え4

4 番目のフィールドを$F[3]リスト区切り文字$"(デフォルトはspace) とともにレコード/行の先頭に配置します。オプションはレコードに-pなります。autoprint

perl -pale 's/^/$F[3]$"/' yourfile

sed コマンドを使用して、元のコピーを保存し、4 番目のフィールドを囲みます。次に、先頭部分を削除します。そして、パターン スペースに追加することで元のコピーを復元します。パターン スペースには、現在 4 番目のフィールドが保持されています。

sed -e '
   /\n/!h
   //!s/\S\+/\n&\n/4
   /\n.*\n/D
   s/\n.*//;G;s/\n/ /
' yourfile

関連情報