Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 删除前4列_Unix_Awk_Split - Fatal编程技术网

Unix 删除前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 使用

我有一个命令,可以删除前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

使用索引删除列的方法不正确。正如您所了解的,当上一个字段包含与下一个字段相同的单词时,索引可能会混淆并与上一个字段匹配

正确的方法是埃德·莫顿建议的方法

,下面的代码基于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   ^