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