我有一个管道分隔文件,我想在字段/列24之后添加一个新单词(表示为要作为样本的文件名),我尝试使用
awk -F "|" '{{$(NF-2)="filename.txt"} print $0 }' OFS="|"
但这会覆盖相邻的列。
如:
0|ZZZZZ|Mr XXXXX|73 Up hill|Hurley|Atherstone|||XXX XXX|GB|00.01.2017|2134567686|7902379xxx|01.09.2017|25|||239|Stores Sheffield|||07.01.2018|13.10.2016||X||NP
是:
0|ZZZZZ|Mr XXXXX|73 Up hill|Hurley|Atherstone|||XXX XXX|GB|00.01.2017|2134567686|7902379xxx|01.09.2017|25|||239|Stores Sheffield|||07.01.2018|13.10.2016||filename|X||NP
用awk:
0|ZZZZZ|Mr XXXXX|73 Up hill|Hurley|Atherstone|||XXX XXX|GB|00.01.2017|2134567686|7902379xxx|01.09.2017|25|||239|Stores Sheffield|||07.01.2018|13.10.2016||filename|||NP
可以帮助我在特定位置添加单词而不会覆盖。
答案 0 :(得分:1)
sed支持ERE(-E
或-r
,具体取决于您的sed版本):
sed -E 's/(([^|]*\|){24})/\1filename.txt|/'
答案 1 :(得分:0)
这个怎么样,这个想法就像是认为文件是csv
但是使用|
作为分隔符:
awk -F"|" 'BEGIN { OFS = "|" } {$24="filename"}1' file
但是这会输出:
...13.10.2016|filename|X||NP
在您想要的输出示例中没有额外的|
:
...13.10.2016||filename|X||NP
这可能是一个错字吗?
无论如何,来自@ akshay-hegde的答案简短而干净:
awk 'BEGIN{FS=OFS="|"}{$24=FILENAME}1' file
答案 2 :(得分:0)
我有一个管道分隔文件,我想在字符位置24之后添加一个新单词(表示为要作为样本的文件名),
在char位置24,它不会给出预期的输出,可能你需要的是如下,这将使用filename.txt设置记录中的第24列,
0|ZZZZZ|Mr XXXXX|73 Up hill|Hurley|Atherstone|||XXX XXX|GB|00.01.2017|2134567686|7902379xxx|01.09.2017|25|||239|Stores Sheffield|||07.01.2018|13.10.2016||X||NP
^
|
This is 24th char position
,因为你没有发布没有代码标签,我认为,它的一行,包含总共27个字段,其中分隔符是管道(|
)
awk 'BEGIN{FS=OFS="|"}{$24="filename.txt"}1' file
如果您想在第24个字段中输入当前文件名,请使用FILENAME
awk 'BEGIN{FS=OFS="|"}{$24=FILENAME}1' file
NF-2
给了25,你仍然可以纠正你的
代码NF-3
,以便修改第24个字段要在char位置24插入一些字符串,我更喜欢
sed
sed -r -e 's/^.{24}/&filename.txt/' filename
答案 3 :(得分:0)
awk -F\| '{ for (i=1;i<=NF-2;i++) { printf "%s|",$i };printf "%s","filename";for (i=NF-1;i<=NF;i++) { printf "|%s",$x } }' filename
打印所有|分隔字段直到X并使用for循环打印。打印&#34;文件名&#34;然后打印剩余的字段。