awkを使用して位置パラメータの後のすべての内容を印刷する方法はありますか?次のコマンドで印刷したいのは「p4 p5 p6 p7」です。
echo p1 p2 p3 p4 p5 p6 p7 | awk '{print $4...}'
また、2つの位置パラメータの間に印刷することも可能ですか?以下に「p4 p5 p6」を印刷します。
echo p1 p2 p3 p4 p5 p6 p7 | awk '{print $4...$6}'
正規表現を使用して次のように入力することを避けたい: awk '{print $4" "$5" "$6}'
ベストアンサー1
awk
(一種のループを使用せずに)これを行うことは不可能ですが、perl
可能です。
ただし、perl
配列は0から始まります(そして配列のawk
索引付けは1から始まります)。
たとえば、次のように自動分割にperl
' オプションを使用します。-a
awk
$ echo p1 p2 p3 p4 p5 p6 p7 | perl -lane 'print "@F[3..$#F]";'
p4 p5 p6 p7
$ echo p1 p2 p3 p4 p5 p6 p7 | perl -lane 'print "@F[2,4,6]";'
p3 p5 p7
$ echo p1 p2 p3 p4 p5 p6 p7 | perl -lane 'print "@F[1..3]";'
p2 p3 p4
注:-l
Perlの行末の自動処理をオンにし、-n
自動出力なしで1行ずつ入力を処理するループでラップします(sedの-nオプションに似ています。 -p
同じことを行いますが、次の内容を自動的に印刷します。各入力行は確認済みです。望むよりman perlrun
。
配列と配列の分割の詳細については、man perldata
またはを参照してください。perldoc perlvar
配列フラグメントは二重引用符で囲まれた文字列内に印刷されるため、$"
aka値を使用して$LIST_SEPARATOR
配列要素を区切ります。二重引用符で囲まれた文字列の外側で印刷/使用される場合、要素間に区切り文字はまったくありません。 LIST_SEPARATORを確認man perlvar
またはperldoc perlvar
検索してください。
-F
最後に、フィールド区切り文字が空白(PCREで)でない場合は、Perlのoptionsを使用するか、\s+
直接分割してください。例えば
$ echo "p1:p2:p3:p4:p5:p6:p7" | perl -F: -lane 'print "@F[0..4]";'
p1 p2 p3 p4 p5
$ echo "p1:p2:p3:p4:p5:p6:p7" | perl -lne '@F=split /:/; print "@F[0..4]";'
p1 p2 p3 p4 p5