awk 插入列并在单行上打印
awk insert columns and printing on single line
我正在尝试使用 AWK 处理逗号分隔的文本文件并插入新列。
我想把第二列的内容分成三部分插入三列
在新文本文件中的 B 列之后。
insert.txt - 我的数据
column A, name|ID1234 @ tag1, column C, column D
我正在尝试生成的输出
column A, name|ID1234 @ tag1, name, ID1234, tag1, column C, column D
我试过的代码
#!/bin/awk
BEGIN {
FS=","
OFS=","
}
{
# Split Column B - twice
split(,a,"|") #a[1] a[2] seperated by |
split(a[2],b,"@") #b[1] b[2] seperated by @
print ,,a[1],b[1],b[2];
{for(i=3;i<=NF;++i) printf $i}
}
awk -f insert.awk insert.txt > output.txt
如何将输出格式化为在一行中,用逗号分隔插入的列?
是否可以输出到trim每列开头和结尾的白色space?
谢谢
约书亚
您可以在 awk
的任何版本中使用此解决方案:
awk 'BEGIN {FS=OFS=", "}
{v2 = ; gsub(/ *[|@] */, OFS, v2); = OFS v2} 1' file
column A, name|ID1234 @ tag1, name, ID1234, tag1, column C, column D
我们使用字段分隔符 ", "
拆分每条记录,然后在 </code> 的存储值中用相同的字段分隔符替换 <code>|
和 @
变量 [=16] =].然后我们在 </code> 中追加 <code>v2
的更改值 OFS
之后,最后打印完整记录。
awk
的另一种可能是
awk 'BEGIN {FS=OFS=", "}{split(,a,/[ |]/);print , , a[1], a[2], a[4], , }' file
column A, name|ID1234 @ tag1, name, ID1234, tag1, column C, column D
我们使用 split()
将 </code> 字段 <code>name|ID1234 @ tag1
拆分为保存在 a
数组中的片段。然后我们在 </code> 和 <code>
字段之间打印其中三个 a[1]
a[2]
a[4]
split()
的分隔符可以是正则表达式,而不仅仅是单个字符:/[ |]/
使用您显示的示例,请尝试以下 awk
代码。使用 GNU awk
.
编写和测试
awk '
match([=10=],/^[^,]*,[^,]*,/){
val1=
sub(/\|/,", ",val1)
val2=val3=substr([=10=],RSTART,RLENGTH)
sub(/.*@ /,"",val3)
print val2, val1 ", " val3 substr([=10=],RSTART+RLENGTH)
}
' Input_file
我正在尝试使用 AWK 处理逗号分隔的文本文件并插入新列。 我想把第二列的内容分成三部分插入三列 在新文本文件中的 B 列之后。
insert.txt - 我的数据
column A, name|ID1234 @ tag1, column C, column D
我正在尝试生成的输出
column A, name|ID1234 @ tag1, name, ID1234, tag1, column C, column D
我试过的代码
#!/bin/awk
BEGIN {
FS=","
OFS=","
}
{
# Split Column B - twice
split(,a,"|") #a[1] a[2] seperated by |
split(a[2],b,"@") #b[1] b[2] seperated by @
print ,,a[1],b[1],b[2];
{for(i=3;i<=NF;++i) printf $i}
}
awk -f insert.awk insert.txt > output.txt
如何将输出格式化为在一行中,用逗号分隔插入的列?
是否可以输出到trim每列开头和结尾的白色space?
谢谢 约书亚
您可以在 awk
的任何版本中使用此解决方案:
awk 'BEGIN {FS=OFS=", "}
{v2 = ; gsub(/ *[|@] */, OFS, v2); = OFS v2} 1' file
column A, name|ID1234 @ tag1, name, ID1234, tag1, column C, column D
我们使用字段分隔符 ", "
拆分每条记录,然后在 </code> 的存储值中用相同的字段分隔符替换 <code>|
和 @
变量 [=16] =].然后我们在 </code> 中追加 <code>v2
的更改值 OFS
之后,最后打印完整记录。
awk
的另一种可能是
awk 'BEGIN {FS=OFS=", "}{split(,a,/[ |]/);print , , a[1], a[2], a[4], , }' file
column A, name|ID1234 @ tag1, name, ID1234, tag1, column C, column D
我们使用 split()
将 </code> 字段 <code>name|ID1234 @ tag1
拆分为保存在 a
数组中的片段。然后我们在 </code> 和 <code>
字段之间打印其中三个 a[1]
a[2]
a[4]
split()
的分隔符可以是正则表达式,而不仅仅是单个字符:/[ |]/
使用您显示的示例,请尝试以下 awk
代码。使用 GNU awk
.
awk '
match([=10=],/^[^,]*,[^,]*,/){
val1=
sub(/\|/,", ",val1)
val2=val3=substr([=10=],RSTART,RLENGTH)
sub(/.*@ /,"",val3)
print val2, val1 ", " val3 substr([=10=],RSTART+RLENGTH)
}
' Input_file