AWK 重新排列文件以在现有列中创建新值
AWK rearranging file to create new values in existing column
我有以下名为 an.txt 的文件:
awk -F'\t' 'NR>1{print [=10=]}' an.txt | head -n 4
Bank Fee Monthly A/C Fee -8.50 31/03/2021
Eft-Pos Rutherford & Bond 4835******** 8848 C 210331123119 -250.00 31/03/2021
Payment Avery Johnson Avery Johnso 592315 Labour -131.60 31/03/2021
Bill Payment Collins Tf 127 Driver Crescent I1600 50.00 31/03/2021
我已使用以下命令重新配置文件:
awk 'BEGIN{FS=OFS="\t"} NR>1{split(,a,"/") ; print a[3]"-"a[2]"-"a[1]"\t""\t""\t""\t"}' an.txt | head -n 4
2021-03-31 -8.50 Monthly A/C Fee
2021-03-31 -250.00 Rutherford & Bond 4835******** 8848 C
2021-03-31 -131.60 Avery Johnson Avery Johnso 592315
2021-03-31 50.00 Collins Tf 127 Driver Crescent
我想实现的是剩下的一列($5)在一个命令中同时打印az。所以我尝试的是以下不成功的命令:
awk 'BEGIN{FS=OFS="\t"} NR>1{split(,a,"/") ; print a[3]"-"a[2]"-"a[1]"\t""\t""\t""\t""\t"="az"}' an.txt | head -n 4
awk: cmd. line:1: ^ syntax error
如何编写命令才能实现以下输出?
期望的输出:
2021-03-31 -8.50 Monthly A/C Fee az
2021-03-31 -250.00 Rutherford & Bond 4835******** 8848 C az
2021-03-31 -131.60 Avery Johnson Avery Johnso 592315 az
2021-03-31 50.00 Collins Tf 127 Driver Crescent az
最初尝试“现在我已经有了这种工作方式,我想让它变得更好”的解决方案有点不正确。
这是 Christian 写的(插入换行符和空格以提高清晰度):
$ awk 'BEGIN {FS=OFS="\t"}
NR>1 {
split(,a,"/") ;
print a[3] "-" a[2] "-" a[1] "\t" "\t" "\t" "\t" "\t" ="az"
}' an.txt | head -n 4
重要的部分是 print 语句,print()
函数的最后一个参数是
="az"
意图很明确——将字符串az
分配给第五列。但是,这对 print 语句没有影响,因为它隐含地提前终止了 print 语句。
为了实现在每行末尾添加字符串 az
的既定目标,打印语句只需要打印它,而不是执行赋值。因此打印语句需要是
print a[3] "-" a[2] "-" a[1] "\t" "\t" "\t" "\t" "\t" az
我个人的偏好是将参数括在括号中以确保我们非常清楚它们是参数,所以我会写
print(a[3] "-" a[2] "-" a[1] "\t" "\t" "\t" "\t" "\t" az)
我有以下名为 an.txt 的文件:
awk -F'\t' 'NR>1{print [=10=]}' an.txt | head -n 4
Bank Fee Monthly A/C Fee -8.50 31/03/2021
Eft-Pos Rutherford & Bond 4835******** 8848 C 210331123119 -250.00 31/03/2021
Payment Avery Johnson Avery Johnso 592315 Labour -131.60 31/03/2021
Bill Payment Collins Tf 127 Driver Crescent I1600 50.00 31/03/2021
我已使用以下命令重新配置文件:
awk 'BEGIN{FS=OFS="\t"} NR>1{split(,a,"/") ; print a[3]"-"a[2]"-"a[1]"\t""\t""\t""\t"}' an.txt | head -n 4
2021-03-31 -8.50 Monthly A/C Fee
2021-03-31 -250.00 Rutherford & Bond 4835******** 8848 C
2021-03-31 -131.60 Avery Johnson Avery Johnso 592315
2021-03-31 50.00 Collins Tf 127 Driver Crescent
我想实现的是剩下的一列($5)在一个命令中同时打印az。所以我尝试的是以下不成功的命令:
awk 'BEGIN{FS=OFS="\t"} NR>1{split(,a,"/") ; print a[3]"-"a[2]"-"a[1]"\t""\t""\t""\t""\t"="az"}' an.txt | head -n 4
awk: cmd. line:1: ^ syntax error
如何编写命令才能实现以下输出?
期望的输出:
2021-03-31 -8.50 Monthly A/C Fee az
2021-03-31 -250.00 Rutherford & Bond 4835******** 8848 C az
2021-03-31 -131.60 Avery Johnson Avery Johnso 592315 az
2021-03-31 50.00 Collins Tf 127 Driver Crescent az
最初尝试“现在我已经有了这种工作方式,我想让它变得更好”的解决方案有点不正确。
这是 Christian 写的(插入换行符和空格以提高清晰度):
$ awk 'BEGIN {FS=OFS="\t"}
NR>1 {
split(,a,"/") ;
print a[3] "-" a[2] "-" a[1] "\t" "\t" "\t" "\t" "\t" ="az"
}' an.txt | head -n 4
重要的部分是 print 语句,print()
函数的最后一个参数是
="az"
意图很明确——将字符串az
分配给第五列。但是,这对 print 语句没有影响,因为它隐含地提前终止了 print 语句。
为了实现在每行末尾添加字符串 az
的既定目标,打印语句只需要打印它,而不是执行赋值。因此打印语句需要是
print a[3] "-" a[2] "-" a[1] "\t" "\t" "\t" "\t" "\t" az
我个人的偏好是将参数括在括号中以确保我们非常清楚它们是参数,所以我会写
print(a[3] "-" a[2] "-" a[1] "\t" "\t" "\t" "\t" "\t" az)