Unix 删除前4列
我有一个命令,可以删除前4列,但不幸的是,如果第2列名称和第4列名称可能相似,它将在第2列截断,但如果第2列和第4列名称不相同,它将在第4列截断。我的命令有什么问题吗 ** **Unix 删除前4列,unix,awk,split,Unix,Awk,Split,我有一个命令,可以删除前4列,但不幸的是,如果第2列名称和第4列名称可能相似,它将在第2列截断,但如果第2列和第4列名称不相同,它将在第4列截断。我的命令有什么问题吗 ** ** 这就是你想要做的吗 $ sed -E 's/([^|]+\| ){4}//' file April | May | June 05 | 06 | 07 $ awk '{sub(/([^|]+\| ){4}/,"")}1' file April | May | June 05 | 06 | 07 使用
这就是你想要做的吗
$ sed -E 's/([^|]+\| ){4}//' file
April | May | June
05 | 06 | 07
$ awk '{sub(/([^|]+\| ){4}/,"")}1' file
April | May | June
05 | 06 | 07
使用索引删除列的方法不正确。正如您所了解的,当上一个字段包含与下一个字段相同的单词时,索引可能会混淆并与上一个字段匹配 正确的方法是埃德·莫顿建议的方法 ,下面的代码基于Ed Morton的建议,为您提供了预期的输出:
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\uu0.03\u0.04\u 03042017.csv
。对于您的真实数据,此文件名应显示正确
无论如何,我只是让Ed Morton的答案适应你的密码。如果您对这个解决方案感到满意,您应该接受Ed Morton的回答
PS:我刚刚从Ed Morton的答案中删除了一个空格,因为它似乎对你不太清楚的数据更有效
教育署建议:
awk '{sub(/([^|]+\| ){4}/,"")}1' file
#Mind this space ^
如果每个字段后面没有空格(即April | May
),则此处的空格可能无法捕获您的数据
另一方面,通过删除此空格,Ed解决方案似乎可以正确匹配格式为
April | May
或格式为April | May的字段,awk脚本与删除4列有何关系?你可能发布了错误的脚本吗?为什么不问一个新问题而不是改变条件?我想确保该列在前4列中删除@EdMorton@Jiji:假设您的意思是“删除前4列”:根据您的示例输入,这些命令正是这样做的。@mklement0您是对的。但如果我的第二栏和第四栏有可能,我就有问题了same@Jiji:但是,如果严格按照列索引进行,这并不重要。您的代码尝试使用index()
查找整行中字段$5
的字符偏移量,这可能与前面的字段匹配,但您的示例输入并非如此。请更新你的问题。@Jiji对不起,我不知道你想说什么。请编辑您的问题以向我们展示。@EdMorton Ed,可以从代码中删除此额外空间吗?谢谢,但请留下它,因为我认为OP还没有告诉我们他的真实问题或真实数据是什么样子。我不相信他的真实数据看起来像他目前在问题中所展示的那样,所以没有必要通过篡改答案来让他们在这方面发挥作用。
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
awk '{sub(/([^|]+\| ){4}/,"")}1' file
#Mind this space ^