如果存在于csv文件列中,则替换值

时间:2018-01-13 08:42:20

标签: bash shell csv awk sed

我需要找到ip的前三个部分的所有值,如果重复,我将第四部分更改为.255。

示例:

216.239.35.207
216.239.35.209
216.239.35.209
209.85.255.97
209.85.255.97
216.239.35.207
216.239.35.207
216.239.35.209
216.239.35.207
216.239.35.207
216.239.35.207
216.239.35.207
216.239.35.209

变为

216.239.35.255
216.239.35.255
216.239.35.255
209.85.255.97
209.85.255.97
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255

由于

4 个答案:

答案 0 :(得分:1)

根据OP's answer修改了答案,似乎他的代码会查找前三个字段重复的。如果只有一个块,请不要管它,如果至少有两个块,(一个块的三个字段重复另一个块),更改这些行的 4th 字段。

使用管道工具查找具有重复字段 1-3 的块,然后使用第二 uniq仅找到重复的块,(要更改的块) ,然后使用它们生成一些sed代码来完成工作:

cut -d. -f1,2,3 data | uniq -d | sort | uniq -d | 
sed 's#.*#/^&./s/.*/&.255/#' | sed -f - data

输出:

216.239.35.255
216.239.35.255
216.239.35.255
209.85.255.97
209.85.255.97
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255

这个答案避免了:

  • 临时文件。
  • 幻数(它不检查字段#3或#4是否等于 97 255 ,或类似的东西)
  • shell变量。

答案 1 :(得分:0)

正如你所教导的猜测所说,awk是你的朋友。但说实话,你的问题非常简洁。您可以使用与下面编码类似的行执行某些操作。请随时修改。

# awk -v FS='.' -v OFS='.' 'BEGIN{i=1}NR==FNR{rec[i]=$0;$4="";pref[i++]=$0;next}
     END{
       pref[0]=pref[1];pref[i]=pref[i-1]
       for(i=1;i<=NR;i++){
         if(match(pref[i-1],pref[i+1]))
           sub(/.[0-9]+$/,".255",rec[i]);
         print rec[i];

       }
     }' case_file_48238278
216.239.35.255
216.239.35.255
216.239.35.209
209.85.255.97
209.85.255.97
216.239.35.207
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255

答案 2 :(得分:0)

最后,这个shell脚本解决了这个问题:

#!/bin/bash

cat tt4 | sort -u | cut -d. -f1,2,3 > tmp1
awk 'BEGIN {while ((getline < "tmp1") > 0) { a[$0]++; if(a[$0] == 2) print; 
if (a[$0] >= 2) print }}' | sort -u > tmp2


while read line
 do 
 a=`echo $line |  cut -d. -f1,2,3`

   if [ `cat tmp2 | grep $a` ]; then

    fin=.255

    b=`echo $a$fin`
    echo $b

   else

   echo $line
   fi

 done < tt4

结果是

216.239.35.255
216.239.35.255
216.239.35.255
209.85.255.97
209.85.255.97
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.35.255
216.239.36.255
216.239.36.255

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r 'N;s/(.*\.).*\n\1.*/\1255\n\1255/;P;D' file

将连续的类似IP地址更改为以255

结尾的地址
sed 's/216\.239\.35\..*/&255/' file

将特定类型的IP更改为以255

结尾的内容