删除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
用于使用索引删除列的方法不正确。正如你所想的那样,当前一个字段包含与下一个字段相同的单词时,索引可能会混淆并匹配前一个字段。
正确的方法是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
@EdMorton Ed,可以从你的代码中删除这个额外的空间吗? –
谢谢,但只是把它留下,因为我不认为OP已经告诉我们他真正的问题是什么或真实的数据看起来像。我不认为他的真实数据看起来像他目前在他的问题中显示的那样,所以根本没有必要对他们的答案进行按摩。 –
要么字段awk脚本是如何与去除4列?你可能发布了错误的脚本吗? –
你为什么不问一个新问题而不是改变条件? –