列形式のデータを含むテキストファイルがあり、特定の条件を満たす行をフィルタリングしようとしています。 2番目の列のデータは、列162ではなく列161から始まります。したがって:
EP10101 12011 SC0 NCI Application Security DLS3270 SC040P20Maintain User Access MF20170901150328000NGS2 20170901150328000
EP10101 12011 SC0 NCI Application Security DLS3270 SC040P20Maintain User Access PF20170901150328000NGS2 20170901150328000
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS20P10RDR Maintenance B20171016171130000NGS2 20171016171130000
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS07P10NCFI Lease/Loan Payout Query B20171016134250000NGS2 20171016134250000
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS20P10RDR Maintenance B20171016143354000NGS2 20171016143354000
処理後、次の内容が残ります。
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS20P10RDR Maintenance B20171016171130000NGS2 20171016171130000
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS07P10NCFI Lease/Loan Payout Query B20171016134250000NGS2 20171016134250000
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS20P10RDR Maintenance B20171016143354000NGS2 20171016143354000
コマンドラインツールを使用してこれを達成するにはどうすればよいですか?
修正する
パターンが一致する行を削除し、ファイルの最後の列も削除する必要があります。したがって、最終出力は次のようになります。
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS20P10RDR Maintenance
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS07P10NCFI Lease/Loan Payout Query
答え1
質問が完全にはっきりしていないので少し推測ですが、
sed '/^.\{160\}\S\+/d' file
161列(空白ではない)に「データ」がある場合は、その行を削除します。他のすべての行は印刷されます。結果は次のとおりです。
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS20P10RDR Maintenance B20171016171130000NGS2 20171016171130000
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS07P10NCFI Lease/Loan Payout Query B20171016134250000NGS2 20171016134250000
OS10101 12011 DLS NCI Dealer Systems DLS3270 DLS20P10RDR Maintenance B20171016143354000NGS2 20171016143354000
(より良い方法があるとは思わないかもしれませんが、これはOPが提供するすべてです。)
答え2
テストした後、うまく動作する次のコマンドを使用します。
for i in $(awk '{if ((length($1) > "160") && (length($1) < "184"))print NR}' filename); do sed "$i"d p.txt; done