Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何将第三列打印到最后一列?_Linux_Shell_Unix_Multiple Columns - Fatal编程技术网

Linux 如何将第三列打印到最后一列?

Linux 如何将第三列打印到最后一列?,linux,shell,unix,multiple-columns,Linux,Shell,Unix,Multiple Columns,我试图从DbgView日志文件中删除前两列(我不感兴趣)。我似乎找不到一个从第3列开始一直打印到行尾的示例。请注意,每行的列数是可变的 awk'{for(i=3;i使用正则表达式可以很容易地实现相同的效果。假设分隔符是一个空格,它看起来像: awk '{for(i=3;i<=NF;++i)print $i}' awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }' …或者更简单的解决方案:cut-f3-INPUTFILE只需添加正确的分隔符(-d)你也得

我试图从DbgView日志文件中删除前两列(我不感兴趣)。我似乎找不到一个从第3列开始一直打印到行尾的示例。请注意,每行的列数是可变的

awk'{for(i=3;i使用正则表达式可以很容易地实现相同的效果。假设分隔符是一个空格,它看起来像:

awk '{for(i=3;i<=NF;++i)print $i}' 
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'

…或者更简单的解决方案:
cut-f3-INPUTFILE
只需添加正确的分隔符(-d)你也得到了同样的效果。

乔纳森·范伯格的答案将每个字段打印在单独的一行上。你可以使用
printf
在同一行上重建输出记录,但也可以将字段向左移动

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk'{for(i=1;i

注意:此方法将在1,2,3字段中留下“空白”,但如果您只想查看输出,则不会出现问题。

下面的行如何:

awk '{$1=$2=$3=""; print}' file awk“{$1=$2=$3=”“;print}”文件 基于@ghostdog74建议。当您过滤行时,我的应该表现得更好,即:

awk '/^exim4-config/ {$1=""; print }' file awk“/^exim4 config/{$1=”“;print}”文件 在此处找到解决方案:

这里有点晚了,但是上面的这些似乎都不起作用。试试这个,使用printf,在每一行之间插入空格。我选择在末尾不使用换行符

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
awk'{for(i=3;i
这将切掉给定字段编号N之前的内容,并打印行的所有其余部分,包括字段编号N和保持原始间距(不重新格式化)。字段字符串是否也出现在行的其他位置并不重要,这是daisaa答案的问题

定义一个函数:

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
然后像这样使用它:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 
输出维护所有内容,包括尾随空格

对于以“/n”为记录分隔符的文件,此功能非常有效,因此行中没有新行字符。如果要将其与其他记录分隔符一起使用,请使用:

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

例如,只要不在行中使用第1个十六进制字符,几乎所有文件都能正常工作。

awk'{for(i=4;i以下awk命令打印每行的最后N个字段,并在行尾打印新行字符:

awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
awk'{for(i=6;iPerl解决方案:

perl -lane 'splice @F,0,2; print join " ",@F' file
使用以下命令行选项:

  • -n
    循环输入文件的每一行,不要自动打印每一行

  • -l
    在处理之前删除换行符,然后将其添加回

  • -a
    自动拆分模式–将输入行拆分为@F数组。默认情况下,在空白处拆分

  • -e
    执行perl代码

splice@F,0,2
从@F数组中干净地删除列0和1

join”“@F
使用每个元素之间的空格连接@F数组的元素

如果输入文件以逗号分隔,而不是空格分隔,请使用
-F,-lane


Python解决方案:

perl -lane 'splice @F,0,2; print join " ",@F' file

python-c“导入sys;[sys.stdout.write(''.join(line.split()[2:])+'\n'),用于sys.stdin]中的行”

如果只是忽略前两个字段,并且在屏蔽这些字段时不需要空格(如上面的一些答案所示):


在Bash中,可以对位置参数使用以下语法:

while read -a cols; do echo ${cols[@]:2}; done < file.txt
读取时-a cols;do echo${cols[@]:2};done
了解更多:在Bash黑客维基

awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'
前两列被清除,
sed
删除前导空格

awk '{a=match($0, $3); print substr($0,a)}'
首先找到第三列的开始位置。
使用substr,您将打印整行($0),从位置(在本例中为a)开始直到行的末尾。

在AWK中,列称为字段,因此NF是键

所有行:

awk -F '<column separator>' '{print $(NF-2)}' <filename>
awk-F'{print$(NF-2)}
仅第一行:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>

awk-F''NR如果要打印第3行之后的列,例如在同一行中,可以使用:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
它将打印:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

正如我们所看到的,工资单即使有空格,也显示在正确的行中。

awk'{print'}{for(i=3;iawk'{for(i=3;iThanks,lh3。我只是在复制和粘贴gawk手册。)如果有多行,这就失败了,当使用print打印时,每一列都被视为新行。为了解决拆分的输出问题,我提出了这样的解决方案:
awk'{for(I=3;iOr:
echo$(seq 110)| awk'{for(I=3;iI)可以避免正则表达式。它可能更慢,更容易意外地弄乱。它可以这样缩短:
awk'{sub(/([^]++){2}/,“”);print}'
这会使模式消失两次。请注意,只有当所有列之间的分隔符完全相同时,这才有效……例如,不能将cut与\d+(我知道)这样的分隔符一起使用当问题名为awk时,不适合接受除awk以外的答案。如果人们需要它来编写awk脚本呢?这个答案应该只是一个评论。@SyaZ:通常我会同意,但鉴于这个板上有大量的“免费awk”,我认为需要展示另一种完成任务的方式。如果是这样的话,你会感激吗omeone向您展示了一种更简单、更快的方法来完成同样的任务?也许海报认为awk是唯一的方法,因为对其他问题的回答“不正确,但肯定可以改进”?这就是评论的目的。接受最好的awk答案,并对评论提供更好的非awk建议。如果人们开始发帖如果答案不能准确回答问题,搜索时会很烦人(以我为例)。不仅所有列之间的分隔符必须相同,而且列之间必须只有一个分隔符。因此,如果您处理的程序将其输出与分隔符对齐,则最好使用awk。我有点晚了,但这对第一个或第二个字段等于第三个字段的记录不起作用(例如,3 2 3 4 5)打印实习生
awk '{print ""}{for(i=3;i<=NF;++i)printf $i" "}'
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf
awk '{print ""}{for(i=3;i<=NF;++i)printf $i" "}'