在shell

时间:2017-10-04 10:36:26

标签: bash shell awk sed scripting

我有一个管道分隔文件,我想在字段/列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

可以帮助我在特定位置添加单词而不会覆盖。

4 个答案:

答案 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;然后打印剩余的字段。