열 형식 데이터가 포함된 텍스트 파일이 있고 특정 조건을 충족하는 행을 필터링하려고 합니다. 두 번째 열의 데이터는 열 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