列中有空字段的awk
这是我的文件.dat 运行awk“{print$2}”file.dat可提供: 但我想保留空白字段:列中有空字段的awk,awk,Awk,这是我的文件.dat 运行awk“{print$2}”file.dat可提供: 但我想保留空白字段: A 4 U 怎么做 我必须补充一点: 第1列和第2列有3个空格字段分隔符 第2列和第3列以及第3列和第4列之间有一个空格字段分隔符 因此,在第2列中有两个字段缺少第2行和第4行,在第4列中有两个字段缺少第2行和第4行 还有两个字段缺少第3行和第5行,如果这不是您所需要的全部: $ awk -F'[ ]' '{print $4}' file A 4 U 然后编辑您的问题,以提供更具代表
A
4
U
怎么做
我必须补充一点:
第1列和第2列有3个空格字段分隔符
第2列和第3列以及第3列和第4列之间有一个空格字段分隔符
因此,在第2列中有两个字段缺少第2行和第4行,在第4列中有两个字段缺少第2行和第4行
还有两个字段缺少第3行和第5行,如果这不是您所需要的全部:
$ awk -F'[ ]' '{print $4}' file
A
4
U
然后编辑您的问题,以提供更具代表性的示例和更清晰的要求。您的awk代码缺少字段分隔符
您的示例文件没有清楚地显示字段分隔符是什么
根据观察,您的文件似乎有5列
首先需要确定字段分隔符是什么
此示例代码需要\t作为字段分隔符
awk -F'\t' '{print $3}' OFS='\t' file.dat
这将从文件中输出第三列。这是'read-in'字段分隔符-F'\t',OFS='\t'是'read-out'
A
4
U
对于GNU awk。它处理文件两次。它第一次检查字符串索引只有空间的所有记录,并将连续的空间序列视为分隔符字符串。第二次,它将其用于数据的固定宽度处理 a[i]:s get valus 0/1,带有此输入的h标头将为100010101,这将导致FIELDWIDTHS=4 2 1: 脚本:
$ awk '
NR==FNR {
for(i=1;i<=length;i++) # all record chars
a[i]=((a[i]!~/^(0|)$/) || substr($0,i,1)!=" ") # keep track of all space places
if(--i>m)
m=i # max record length...
next
}
BEGINFILE {
if(NR!=0) { # only do this once
for(i=1;i<=m;i++) # ... used here
h=h a[i] # h=100010101
while(match(h,/10*/)) { # build FIELDWIDTHS
FIELDWIDTHS=FIELDWIDTHS " " RLENGTH # qnd
h=substr(h,RSTART+RLENGTH)
}
}
}
{
print $2 # and output
}' file file
但是,您需要从字段中删除空格。如果输入是固定宽度的列,则可以使用substr提取所需的切片。我假设您希望索引5处有一个字符:
awk '{ print(substr($0,5,1)) }' file
将字段分隔符设置为精确的一个空格可能有助于GNU awk和mawk:awk-F'?''{print$2}文件在我的文件中,两列之间的精确字段分隔符不是常量,可以是一、二或七whitespace@olivierdadoun在这种情况下,如何定义第二列?@Cyrus awk-F'?'{print$2}'file在任何awk中的含义都是相同的,它并不意味着将字段分隔符设置为精确的一个空格,它意味着将FS设置为零或1个空白字符,但在给定该设置的情况下,任何awk实际尝试执行的操作都是YMMV。任何awk中的FS为awk-F'[]'''.''时,若要将1留空,请查看您的问题历史记录,我认为您应该阅读以下内容:
1 A 1 4
2 2 4
3 4 4
3 7 B
1 U 2
| | | |
100010101 - while(match(h,/10*/))
\ /|/|/|
4 2 2 1
$ awk '
NR==FNR {
for(i=1;i<=length;i++) # all record chars
a[i]=((a[i]!~/^(0|)$/) || substr($0,i,1)!=" ") # keep track of all space places
if(--i>m)
m=i # max record length...
next
}
BEGINFILE {
if(NR!=0) { # only do this once
for(i=1;i<=m;i++) # ... used here
h=h a[i] # h=100010101
while(match(h,/10*/)) { # build FIELDWIDTHS
FIELDWIDTHS=FIELDWIDTHS " " RLENGTH # qnd
h=substr(h,RSTART+RLENGTH)
}
}
}
{
print $2 # and output
}' file file
A
4
U
awk '{ print(substr($0,5,1)) }' file