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

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

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

xx ss ss "abcde"

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

"abcde" xx ss ss "abcde"

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

答え1

もう一つの奇妙な:

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 &/'

このパターンは、空白ではないと識別される3つの反復列と一致し、その後に空白が続き、代替\2文字列に引用された他の列が続きます。完全一致を代替アイテムに追加すると、行の残りの全体の&前に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-pautoprint

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

関連情報