我想使用awk打印重新排列的字段,然后从第4个字段打印到结尾

时间:2017-10-09 19:46:30

标签: bash awk

我有一个包含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场到最后。有人可以帮忙吗?

5 个答案:

答案 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