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
-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