这是我的file.dat
1 A 1 4
2 2 4
3 4 4
3 7 B
1 U 2
运行awk '{print $2}' file.dat
给出:
A
2
4
7
U
但我想保留空白字段:
A
4
U
如何做到?
我必须在:之间加上它:
第1列和第2列有3个空格字段分隔符
第2列和第3列以及第3列和第4列之间的一个空白字段分隔符
因此,在第2列中缺少2个字段(第2行和第4行),在第4列中 还有2个字段缺失(第3行和第5行)
答案 0 :(得分:1)
如果这还不是您所需要的:
$ awk -F'[ ]' '{print $4}' file
A
4
U
然后编辑您的问题,以提供更真实的示例和更明确的要求。
答案 1 :(得分:1)
如果输入为固定宽度的列,则可以使用substr
提取所需的切片。我假设您要在索引5处输入一个字符:
awk '{ print(substr($0,5,1)) }' file
答案 2 :(得分:0)
您的awk
代码缺少字段分隔符。
您的示例文件没有清楚显示字段分隔符是什么。
从观察结果看,您的文件似乎有5列。
您需要确定什么是字段分隔符。
此示例代码期望\t
表示<TAB>
作为字段分隔符。
awk -F'\t' '{print $3}' OFS='\t' file.dat
这将输出文件的第三列。这是“读入”字段分隔符-F'\t'
,而OFS='\t'
是“读入”字段。
A
4
U
答案 3 :(得分:0)
对于GNU awk。它将文件处理两次。第一次,它检查所有字符串索引仅具有空格的记录,并将连续的空格序列视为构成FIELDWIDTHS
variable的分隔符字符串。第二次将它用于固定宽度的数据处理。
a[i]
:得到的值是0/1,此输入的h
(标题)将为100010101,并导致FIELDWIDTHS="4 2 2 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
不过,您需要修剪字段中的空间。