我有一个包含filesize,filedate,filetime和filepath记录的文本文件。文件路径可以包含空格,可以很长(古典音乐名称)。我想用filedate,filetime,filesize和filepath打印文件。没有文件路径的第一部分很简单:
awk '{print $2,$3,$1}' filelist.txt
这样可行,但它会在两行上打印记录:
awk '{print $2,$3,$1,$1=$2=$3=""; print $0}' filelist.txt
我尝试过使用cut -d'' - f'2 3 1 4',但这不允许重新排列字段。我可以使用sed加入修复两行问题。必须有一种方法只使用awk。总之,我想打印第2,第3,第1和第4场到最后。有人可以帮忙吗?
答案 0 :(得分:0)
我尽可能避免使用awk。如果我理解你所说的话 -
while read size date time path
do echo "$date $time $size $path"
done < filelist.txt
您可以printf
代替echo
获取更多格式选项。
$ path中的嵌入空间无关紧要,因为它是最后一个字段。
答案 1 :(得分:0)
我手边没有awk
来测试,但我想您可以使用printf
来格式化单行输出。只需在$0
中找到第三个空格,然后从该位置获取一个子串到输入行的末尾。
你也可以尝试在标准print
之前交换字段,虽然我不确定它会产生预期的效果......
答案 2 :(得分:0)
使用<tab>
之类的内容来界定字段总是有帮助的,因此后续操作更容易......(我可以看到您使用cut
而没有-d
,所以也许您的数据是已经制表符分隔。)
echo 1 2 3 very long name |
sed -e 's/ /\t/' -e 's/ /\t/' -e 's/ /\t/' |
awk -v FS='\t' -v OFS='\t' '{print $2, $3, $1, $4}'
第一行生成数据。 sed
命令用\t
替换每行中的前三个空格。然后awk
完美无瑕地工作,再次输出制表符分隔的数据(你需要一个相当新的awk
)。
答案 3 :(得分:0)
由于awk
中的print
statement始终会在最后打印换行符(技术上ORS
,默认为换行符),您的第一个print
会打破输出两行。
另一方面,使用printf
,您可以使用格式字符串完全控制输出。因此,您可以使用printf
打印前三个字段(不使用换行符),然后将其设置为""
,最后使用print $0
(相当于{{1}没有参数):
print
答案 4 :(得分:0)
使用GNU awk for gensub():
$ echo '1 2 3 4 5 6' | awk '{print $3, $2, $1, gensub(/([^ ]+){3}/,"",1)}'
3 2 1 4 5 6
任何awk:
$ echo '1 2 3 4 5 6' | awk '{rest=$0; sub(/([^ ]+ ){3}/,"",rest); print $3, $2, $1, rest}'
3 2 1 4 5 6