使用sed / awk交换第3列中的字符

时间:2011-01-05 14:15:39

标签: sed awk swap

文件有3列:

123711184642,3583090366663629,0036f920012437d4 123715942138,3538710295145500,0136f920afd6c643

我想删除第三列中的前两个字符: 123711184642,3583090366663629,36f920012437d4 123715942138,3538710295145500,36f920afd6c643

并交换第三列中前两个字符,以便最终结果为: 123711184642,3583090366663629,639f02012437d4 123715942138,3538710295145500,639f02afd6c643

任何帮助将不胜感激。 伯尼

5 个答案:

答案 0 :(得分:1)

假设您的输入数据位于文件“foo”中,您可以执行以下操作:

cat foo | awk -F "," -f awkfile

awkfile包含:

{
  v = ""
  p = $3
  printf ("%s,%s,", $1, $2)
  for (i=3; i<9; i=i+2) {
     printf ("%s%s", substr(p, i+1, 1), substr (p, i, 1))
  }
  printf ("%s\n", substr(p, 9))
}

答案 1 :(得分:1)

使用sed只是分组问题:

sed '
    s/\(.*,\)../\1/;
    s/,\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\([^,]*\)$/,\2\1\4\3\6\5\7/' file

答案 2 :(得分:1)

gawk:

gawk -F, '
    BEGIN {OFS=FS}
    { 
        $3 = gensub(/^..(.)(.)(.)(.)(.)(.)(.*)/, "\\2\\1\\4\\3\\6\\5\\7", 1, $3)
        print
    }
' in.txt

答案 3 :(得分:0)

sed 1班轮。只要你想改变最后一个字段,你就不在乎你有多少个字段。它也不关心最后一个字段有多少对,它们会相同地交换它们。

sed'h; s / ^。,.. //; s /(。)(。)/ \ 2 \ 1 / g; x; s /,[^,] $ /,/; G; s / \ n //'/ path / to / file

输入

$ cat ./infile
123711184642,3583090366663629,0036f920012437d4
123715942138,3538710295145500,0136f920afd6c643

输出

$ sed 'h;s/^.*,..//;s/\(.\)\(.\)/\2\1/g;x;s/,[^,]*$/,/;G;s/\n//' ./infile
123711184642,3583090366663629,639f021042734d
123715942138,3538710295145500,639f02fa6d6c34

解释

  1. h - 制作整个
  2. 的副本
  3. s/^.*,..// - 现在是模式空间 只保留最后一个字段 删除了两个前导号码
  4. s/\(.\)\(.\)/\2\1/g - 这个数字 在模式空间中成对交换
  5. x - 用hold保持交换模式空间 空间
  6. s/,[^,]*$/,/ - 删除整个 最后一个字段
  7. G - 将保留空间附加到 模式空间之间有'\ n' 它们
  8. s/\n// - 删除添加的'\ n' G

答案 4 :(得分:0)

awk 1-liner只是为了它的乐趣。这并不关心第3个字段中有多少对数字,它将适用于所有数字。

awk -F,'{$ 3 = substr(gensub(/(.)(.)/,"/ 2 \ 1“,”g“,$ 3),3)} 1'OFS =,/路径/到/文件

输入

$ cat ./infile
123711184642,3583090366663629,0036f920012437d4
123715942138,3538710295145500,0136f920afd6c643

输出

$ awk -F, '{$3=substr(gensub(/(.)(.)/,"\\2\\1","g",$3),3)}1' OFS=, ./infile
123711184642,3583090366663629,639f021042734d
123715942138,3538710295145500,639f02fa6d6c34