删除4个第一列

问题描述:

我有一个命令可以删除前4列,但不幸的是,如果第二列名称和第四列名称可能类似,它将在第二列截断,但如果第二列和第四列名称不同,它会截断在第4列。我的命令有什么不对吗?删除4个第一列

**

awk -F"|" 'NR==1 {h=substr($0, index($0,$5)); next} 
       {file= path ""$1""$2"_"$3"_"$4"_03042017.csv"; print (a[file]++?"": "DETAILS 03042017" ORS h ORS) substr($0, index($0,$5)) > file} 
       END{for(file in a) print "EOF " a[file] > file}' filename 

**

Input: 

Account Num | Name | Card_Holder_Premium | Card_Holder| Type_Card | Balance | Date_Register 
01 | 02 | 03 | 04  | 05 | 06 | 07 


    Output 

_Premium | Card_Holder| Type_Card | Balance | Date_Register 
04 | 05 | 06 | 07 

My desired output: 

Card_Holder| Type_Card | Balance | Date_Register 
05 | 06 |07 
+1

要么字段awk脚本是如何与去除4列?你可能发布了错误的脚本吗? –

+0

你为什么不问一个新问题而不是改变条件? –

难道这一切你想要做什么?

$ sed -E 's/([^|]+\|){4}//' file 
April | May | June 
05 | 06 | 07 

$ awk '{sub(/([^|]+\|){4}/,"")}1' file 
April | May | June 
05 | 06 | 07 
+0

我想确保列在前4列下降。 @EdMorton – Jiji

+0

@Jiji:假设您的意思是“放弃前4列”:这正是这些命令所做的,根据您的示例输入。 – mklement0

+0

@ mklement0你是对的。但我有问题,如果我的第二列和第四列可能相同 – Jiji

用于使用索引删除列的方法不正确。正如你所想的那样,当前一个字段包含与下一个字段相同的单词时,索引可能会混淆并匹配前一个字段。

正确的方法是Ed Morton建议的方法。

In this online test,基于埃德莫顿的建议娄代码,为您提供您所期望的输出:

awk -F"|" 'NR==1 {sub(/([^|]+\|){3}/,"");h=$0;next} \ 
{file=$1$2"_"$3"_"$4"_03042017.csv"; sub(/([^|]+\|){3}/,""); \ 
print (a[file]++?"": "DETAILS 03042017" ORS h ORS) $0 > file} \ 
END{for(file in a) print "EOF " a[file] > file}' file1.csv 

#Output 
DETAILS 03042017 
Card_Holder| Type_Card | Balance | Date_Register 
04  | 05 | 06 | 07 
EOF 1 

由于您有在您的领域的空白,生成的文件的文件名显示为01 02 _ 03 _ 04 _03042017.csv。用你的真实数据,这个文件名应该显示正确。

在任何情况下,我只是适应埃德莫顿回答你的代码。如果你对这个解决方案感到满意,你应该接受Ed Morton的答案。

PS:我刚刚从埃德莫顿的回答中删除了一个空格,因为它似乎对你不那么清晰的数据更好一些。

埃德建议:

awk '{sub(/([^|]+\|){4}/,"")}1' file 
#Mind this space ^ 

这里这个空间如果每个字段后面没有空格它可能无法赶上你的数据(即April|May)。

在另一方面,通过删除这个空间似乎埃德解决方案能够正确匹配格式April | May或格式April|May

+0

@EdMorton Ed,可以从你的代码中删除这个额外的空间吗? –

+0

谢谢,但只是把它留下,因为我不认为OP已经告诉我们他真正的问题是什么或真实的数据看起来像。我不认为他的真实数据看起来像他目前在他的问题中显示的那样,所以根本没有必要对他们的答案进行按摩。 –