0

我有一个如下文件:

Header1:value1|value2|value3|
Header2:value4|value5|value6|

列号未知,我有一个可以返回列号的函数。

我想编写一个可以从文件中删除一列的脚本。例如,删除第 1 列后,我将得到:

Header1:value2|value3|
Header2:value5|value6|

cut用来实现这一点,到目前为止,我可以在删除一列但没有标题后给出值。例如

value2|value3|
value5|value6|

谁能告诉我如何添加标题?或者任何命令都可以直接做到这一点?谢谢。

4

8 回答 8

2

用管道替换冒号,执行您的cut命令,然后再次用冒号替换第一个管道:

sed 's/:/|/' input.txt | cut ... | sed 's/|/:/'

您可能需要调整 cut 命令的列号,以确保不计算标题。

于 2012-07-06T14:24:12.897 回答
1

把':'变成'|',这样头部就是另一个字段,而不是第一个字段的一部分。您可以在任何生成数据开始时执行此操作,也可以通过将数据传递给tr ':' '|'before cut。然后,您的其余字段将被 +1 抵消,但这应该很容易弥补。

于 2012-07-06T14:23:35.660 回答
1

您的问题是 HeaderX 后跟 ' : ' 这不是 ' | ' 在 cut 中使用的分隔符。

你可以先用 : 将你的行分成两部分,比如“cut -f 1 --delimiter=: YOURFILE”,然后删除第一列,然后放回标题。

于 2012-07-06T14:25:08.683 回答
1

awk 可以处理多个分隔符。所以另一种选择是...

jkern@ubuntu:~/scratch$ cat ./data188 
Header1:value1|value2|value3|
Header2:value4|value5|value6|
jkern@ubuntu:~/scratch$ awk -F"[:|]" '{ print $1 $3 $4 }' ./data188 
Header1value2value3
Header2value5value6
于 2012-07-06T14:40:42.607 回答
0

你可以在sed没有的情况下做到这一点cut

sed 's/:[^|]*|/:/' input.txt
于 2012-07-06T14:28:31.550 回答
0

我的解决方案:

$ sed 's,:,|,' data | awk -F'|' 'BEGIN{OFS="|"}{$2=""; print}' | sed 's,||,:,'
Header1:value2|value3|
Header2:value5|value6|
  • 替换:|
  • -F'|'告诉awk使用|符号作为字段分隔符
  • 在每一行中,我们用空字符串替换第二个(因为标题现在成为第一个)字段,并用新的字段分隔符 ( |)替换打印结果行
  • |通过替换 first来返回标题:

不完美,但应该可以。

于 2012-07-06T14:29:27.200 回答
0

$ cat file.txt | grep 'Header1' | awk -F"1" '{ print $1 $2 $3 $4}'

这将在单独的列中打印所有值。您可以打印任意数量的列。

于 2014-01-08T07:53:27.900 回答
0

只需加入 Perl 解决方案:(
根据需要重新排列/删除字段)

-l 有效地为每个打印语句添加一个换行符
-a 自动拆分模式使用 -F 表达式将每一行拆分为数组 @F
-n 在 - 周围添加一个循环e code
-e your 'one liner' 遵循此选项

$ perl -F[:\|] -lane 'print "$F[0]:$F[1]|$F[2]|$F[3]"' input.txt
于 2014-01-14T03:48:01.283 回答