awk -cut如何使用字段分隔符删除第二列

时间:2018-02-16 13:45:42

标签: bash awk sed

我有一个csv文件,数据如下所示

'&(||o||022344527||o||lonyfoe||o||Joe||o||Joe||o||Otieno

我正在尝试删除第二列。

输出:

'&(||o||lonyfoe||o||Joe||o||Joe||o||Otieno

有什么想法吗?

这是我到目前为止所尝试的

cut -d'||o||' -f2 --complement 

awk -F'||o||' '{
   for(n=1; n<=NF; n++){
      if(n!=NF)fmt="%s|"; else fmt="%s\n"
      if(n!=2)printf(fmt,$n)
   }
}' 

但它不起作用

6 个答案:

答案 0 :(得分:2)

如果您的Input_file与显示的示例相同,那么以下内容可能对您有所帮助:

awk '{sub(/\|\|o\|\|[0-9]+\|\|o\|\|/,"||o||")} 1'  Input_file

输出如下:

'&(||o||lonyfoe||o||Joe||o||Joe||o||Otieno

答案 1 :(得分:1)

cut分隔符只能是单个字符。在您的情况下,您可以使用|,以便将||o||分隔的每个值视为4个字段(空,o,空,值)。第二列现在是5-8范围:

 cut -d'|' -f5-8 --complement

答案 2 :(得分:1)

你可以试试以下......

sed -e 's/||o||/|/g' your-input-file | cut -d'|' -f1,3- | sed -e 's/|/||o||/g'
  • 第一个sed命令将原始分隔符转换为单个&#39; |&#39;使用cut命令可以更好地工作。 cut命令似乎只需要单个字符分隔符。
  • 剪切命令将剩下的第二个字段删除。 &#39; -f1,3 - &#39;被使用,因为它可能与更多版本的“切割”更加兼容。 &#34; - 补充&#34;选项可能不适用于所有版本的cut命令。例如。在Mac OSX上。
  • 最后的sed命令只是将分隔符反转回原始值
希望有所帮助。

答案 3 :(得分:0)

使用非数字第二个字段添加了示例行

$ cat ip.txt
'&(||o||022344527||o||lonyfoe||o||Joe||o||Joe||o||Otieno
ijk||o||foobar||o||123||o||xyz

使用perl

的解决方案
$ perl -lne '$,="||o||"; @f=split /\Q$,/; print @f[0,2..$#f]' ip.txt
'&(||o||lonyfoe||o||Joe||o||Joe||o||Otieno
ijk||o||123||o||xyz
  • $,="||o||"设置print&#39; s
  • 之间使用的分隔符
  • @f=split /\Q$,/使用$,指定的分隔符获取数组,其中\Q对于转义正则表达式元字符非常有用。默认情况下,split将对$_执行操作 - 在这种情况下为输入记录
  • print @f[0,2..$#f]打印必填字段,值$,确定数组元素之间使用的字符串

答案 4 :(得分:0)

你可以试试这个sed

// create the moment with a specific time zone
var m = moment.tz('2018-02-14T11:11', "America/Chicago");

// convert to UTC
m.utc();

// format the output
var s = m.format();

答案 5 :(得分:0)

这可能适合你(GNU sed):

sed 's/||o||/\n/g;s/[^\n]*\n//2;s/\n/||o||/g' file

按换行符替换所有分隔符。删除第二个字段及其分隔符。用分隔符替换换行符。

替代方案:

sed 's/||o||/\n/2;s/\(.*||o||\).*\n/\1/' file